hasDefinition(WidgetRegistry::class)) { return; } $widgetRegistryDefinition = $container->findDefinition(WidgetRegistry::class); foreach ($container->findTaggedServiceIds($this->tagName) as $serviceName => $tags) { $definition = $container->findDefinition($serviceName); $definition->setPublic(true); foreach ($tags as $attributes) { $identifier = $attributes['identifier'] ?? $serviceName; $attributes['identifier'] = $identifier; $attributes['serviceName'] = $serviceName; $attributes['adminOnly'] = is_a($definition->getClass(), AdminOnlyWidgetInterface::class, true); $attributes = $this->convertAttributes($attributes); $configurationServiceName = $this->registerWidgetConfigurationService( $container, $identifier, $attributes ); $definition->setArgument('$configuration', new Reference($configurationServiceName)); $widgetRegistryDefinition->addMethodCall('registerWidget', [$identifier . 'WidgetConfiguration']); } } } private function convertAttributes(array $attributes): array { $attributes = array_merge([ 'iconIdentifier' => 'content-dashboard', 'height' => 'small', 'width' => 'small', ], $attributes); if (isset($attributes['groupNames'])) { $attributes['groupNames'] = GeneralUtility::trimExplode(',', $attributes['groupNames'], true); } else { $attributes['groupNames'] = []; } return $attributes; } private function registerWidgetConfigurationService( ContainerBuilder $container, string $widgetIdentifier, array $arguments ): string { $serviceName = $widgetIdentifier . 'WidgetConfiguration'; $definition = new Definition( WidgetConfiguration::class, $this->adjustArgumentsForDi($arguments) ); $definition->setPublic(true); $container->addDefinitions([$serviceName => $definition]); return $serviceName; } private function adjustArgumentsForDi(array $arguments): array { foreach ($arguments as $key => $value) { $arguments['$' . $key] = $value; unset($arguments[$key]); } return $arguments; } }