tagName = $tagName; $this->orderer = new DependencyOrderingService(); } public function process(ContainerBuilder $container): void { $busFactory = $container->findDefinition(BusFactory::class); $groupedMiddlewares = $this->collectMiddlewares($container); $middlewares = []; foreach ($groupedMiddlewares as $bus => $unorderedMiddlewares) { $middlewares[$bus] = []; foreach ($this->orderer->orderByDependencies($unorderedMiddlewares) as $middleware) { $middlewares[$bus][] = new Reference($middleware['service']); } } $busFactory->setArgument('$middlewares', array_map( static fn(array $busMiddlewares): IteratorArgument => new IteratorArgument($busMiddlewares), $middlewares )); } /** * Collects all messenger middlewares from the container and prepares them for ordering */ private function collectMiddlewares(ContainerBuilder $container): array { $unorderedMiddlewares = []; foreach ($container->findTaggedServiceIds($this->tagName) as $serviceName => $tags) { foreach ($tags as $attributes) { $bus = $attributes['bus'] ?? 'default'; $unorderedMiddlewares[$bus][$serviceName] = [ 'service' => $serviceName, 'before' => GeneralUtility::trimExplode(',', $attributes['before'] ?? '', true), 'after' => GeneralUtility::trimExplode(',', $attributes['after'] ?? '', true), ]; } } return $unorderedMiddlewares; } }