‪TYPO3CMS  ‪main
MessengerMiddlewarePass.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
21 use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
22 use Symfony\Component\DependencyInjection\ContainerBuilder;
23 use Symfony\Component\DependencyInjection\Reference;
27 
31 final class ‪MessengerMiddlewarePass implements CompilerPassInterface
32 {
33  private string ‪$tagName;
34 
36 
37  public function ‪__construct(string ‪$tagName)
38  {
39  $this->tagName = ‪$tagName;
40  $this->orderer = new ‪DependencyOrderingService();
41  }
42 
43  public function ‪process(ContainerBuilder $container): void
44  {
45  $busFactory = $container->findDefinition(BusFactory::class);
46  $groupedMiddlewares = $this->‪collectMiddlewares($container);
47  $middlewares = [];
48  foreach ($groupedMiddlewares as $bus => $unorderedMiddlewares) {
49  $middlewares[$bus] = [];
50  foreach ($this->orderer->orderByDependencies($unorderedMiddlewares) as $middleware) {
51  $middlewares[$bus][] = new Reference($middleware['service']);
52  }
53  }
54  $busFactory->setArgument('$middlewares', array_map(
55  static fn(array $busMiddlewares): IteratorArgument => new IteratorArgument($busMiddlewares),
56  $middlewares
57  ));
58  }
59 
63  private function ‪collectMiddlewares(ContainerBuilder $container): array
64  {
65  $unorderedMiddlewares = [];
66  foreach ($container->findTaggedServiceIds($this->tagName) as $serviceName => $tags) {
67  $service = $container->findDefinition($serviceName);
68  foreach ($tags as $attributes) {
69  $bus = $attributes['bus'] ?? 'default';
70  $unorderedMiddlewares[$bus][$serviceName] = [
71  'service' => $serviceName,
72  'before' => ‪GeneralUtility::trimExplode(',', $attributes['before'] ?? '', true),
73  'after' => ‪GeneralUtility::trimExplode(',', $attributes['after'] ?? '', true),
74  ];
75  }
76  }
77  return $unorderedMiddlewares;
78  }
79 }
‪TYPO3\CMS\Core\Messenger\BusFactory
Definition: BusFactory.php:27
‪TYPO3\CMS\Core\DependencyInjection\MessengerMiddlewarePass\$tagName
‪string $tagName
Definition: MessengerMiddlewarePass.php:33
‪TYPO3\CMS\Core\DependencyInjection\MessengerMiddlewarePass\$orderer
‪DependencyOrderingService $orderer
Definition: MessengerMiddlewarePass.php:35
‪TYPO3\CMS\Core\DependencyInjection\MessengerMiddlewarePass\collectMiddlewares
‪collectMiddlewares(ContainerBuilder $container)
Definition: MessengerMiddlewarePass.php:63
‪TYPO3\CMS\Core\DependencyInjection
Definition: AutowireInjectMethodsPass.php:18
‪TYPO3\CMS\Core\Service\DependencyOrderingService
Definition: DependencyOrderingService.php:32
‪TYPO3\CMS\Core\DependencyInjection\MessengerMiddlewarePass\__construct
‪__construct(string $tagName)
Definition: MessengerMiddlewarePass.php:37
‪TYPO3\CMS\Core\DependencyInjection\MessengerMiddlewarePass
Definition: MessengerMiddlewarePass.php:32
‪TYPO3\CMS\Core\DependencyInjection\MessengerMiddlewarePass\process
‪process(ContainerBuilder $container)
Definition: MessengerMiddlewarePass.php:43
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Utility\GeneralUtility\trimExplode
‪static list< string > trimExplode(string $delim, string $string, bool $removeEmptyValues=false, int $limit=0)
Definition: GeneralUtility.php:822