‪TYPO3CMS  ‪main
MiddlewareStackResolver.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 
18 namespace ‪TYPO3\CMS\Core\Http;
19 
20 use Psr\Container\ContainerInterface;
22 use ‪TYPO3\CMS\Core\Cache\Frontend\PhpFrontend as PhpFrontendCache;
24 
31 {
35  protected ‪$container;
36 
41 
45  protected ‪$cache;
46 
47  private string ‪$baseCacheIdentifier;
48 
49  public function ‪__construct(
50  ContainerInterface ‪$container,
52  PhpFrontendCache ‪$cache,
54  ) {
55  $this->container = ‪$container;
56  $this->dependencyOrderingService = ‪$dependencyOrderingService;
57  $this->cache = ‪$cache;
58  $this->baseCacheIdentifier = '_' . ‪$baseCacheIdentifier;
59  }
60 
68  public function ‪resolve(string $stackName): array
69  {
70  // Check if the registered middlewares from all active packages have already been cached
71  $cacheIdentifier = $this->‪getCacheIdentifier($stackName);
72  if ($this->cache->has($cacheIdentifier)) {
73  return $this->cache->require($cacheIdentifier);
74  }
75 
76  $allMiddlewares = $this->‪loadConfiguration();
77  $middlewares = $this->‪sanitizeMiddlewares($allMiddlewares);
78 
79  // Ensure that we create a cache for $stackName, even if the stack is empty
80  if (!isset($middlewares[$stackName])) {
81  $middlewares[$stackName] = [];
82  }
83 
84  foreach ($middlewares as $stack => $middlewaresOfStack) {
85  $this->cache->set($this->‪getCacheIdentifier($stack), 'return ' . var_export($middlewaresOfStack, true) . ';');
86  }
87 
88  return $middlewares[$stackName];
89  }
90 
94  protected function ‪loadConfiguration(): \ArrayObject
95  {
96  return $this->container->get('middlewares');
97  }
98 
102  protected function ‪sanitizeMiddlewares(\ArrayObject $allMiddlewares): array
103  {
104  $middlewares = [];
105 
106  foreach ($allMiddlewares as $stack => $middlewaresOfStack) {
107  $middlewaresOfStack = $this->dependencyOrderingService->orderByDependencies($middlewaresOfStack);
108 
109  $sanitizedMiddlewares = [];
110  foreach ($middlewaresOfStack as $name => $middleware) {
111  if (isset($middleware['disabled']) && $middleware['disabled'] === true) {
112  // Skip this middleware if disabled by configuration
113  continue;
114  }
115  $sanitizedMiddlewares[$name] = $middleware['target'];
116  }
117 
118  // Order reverse, MiddlewareDispatcher executes the last middleware in the array first (last in, first out).
119  $middlewares[$stack] = array_reverse($sanitizedMiddlewares);
120  }
121 
122  return $middlewares;
123  }
124 
125  protected function ‪getCacheIdentifier(string $stackName): string
126  {
127  return 'middlewares_' . $stackName . ‪$this->baseCacheIdentifier;
128  }
129 
130  public function ‪warmupCaches(‪CacheWarmupEvent $event): void
131  {
132  if ($event->‪hasGroup('system')) {
133  $allMiddlewares = $this->‪loadConfiguration();
134  $middlewares = $this->‪sanitizeMiddlewares($allMiddlewares);
135 
136  foreach ($middlewares as $stack => $middlewaresOfStack) {
137  $this->cache->set($this->‪getCacheIdentifier($stack), 'return ' . var_export($middlewaresOfStack, true) . ';');
138  }
139  }
140  }
141 }
‪TYPO3\CMS\Core\Http\MiddlewareStackResolver\sanitizeMiddlewares
‪sanitizeMiddlewares(\ArrayObject $allMiddlewares)
Definition: MiddlewareStackResolver.php:99
‪TYPO3\CMS\Core\Http\MiddlewareStackResolver\$container
‪ContainerInterface $container
Definition: MiddlewareStackResolver.php:34
‪TYPO3\CMS\Core\Cache\Frontend\PhpFrontend
Definition: PhpFrontend.php:25
‪TYPO3\CMS\Core\Http\MiddlewareStackResolver\__construct
‪__construct(ContainerInterface $container, DependencyOrderingService $dependencyOrderingService, PhpFrontendCache $cache, string $baseCacheIdentifier)
Definition: MiddlewareStackResolver.php:46
‪TYPO3\CMS\Core\Http\MiddlewareStackResolver
Definition: MiddlewareStackResolver.php:31
‪TYPO3\CMS\Core\Cache\Event\CacheWarmupEvent
Definition: CacheWarmupEvent.php:24
‪TYPO3\CMS\Core\Http\MiddlewareStackResolver\$cache
‪PhpFrontendCache $cache
Definition: MiddlewareStackResolver.php:42
‪TYPO3\CMS\Core\Http\MiddlewareStackResolver\resolve
‪resolve(string $stackName)
Definition: MiddlewareStackResolver.php:65
‪TYPO3\CMS\Core\Http\MiddlewareStackResolver\getCacheIdentifier
‪getCacheIdentifier(string $stackName)
Definition: MiddlewareStackResolver.php:122
‪TYPO3\CMS\Core\Http\MiddlewareStackResolver\$baseCacheIdentifier
‪string $baseCacheIdentifier
Definition: MiddlewareStackResolver.php:44
‪TYPO3\CMS\Core\Http\MiddlewareStackResolver\$dependencyOrderingService
‪DependencyOrderingService $dependencyOrderingService
Definition: MiddlewareStackResolver.php:38
‪TYPO3\CMS\Core\Http\MiddlewareStackResolver\warmupCaches
‪warmupCaches(CacheWarmupEvent $event)
Definition: MiddlewareStackResolver.php:127
‪TYPO3\CMS\Core\Service\DependencyOrderingService
Definition: DependencyOrderingService.php:32
‪TYPO3\CMS\Core\Http\MiddlewareStackResolver\loadConfiguration
‪loadConfiguration()
Definition: MiddlewareStackResolver.php:91
‪TYPO3\CMS\Core\Cache\Event\CacheWarmupEvent\hasGroup
‪hasGroup(string $group)
Definition: CacheWarmupEvent.php:34
‪TYPO3\CMS\Core\Http
Definition: AbstractApplication.php:18