Spaces:
No application file
No application file
| namespace Mautic\Middleware; | |
| use Mautic\CoreBundle\Cache\MiddlewareCacheWarmer; | |
| use Stack\StackedHttpKernel; | |
| class MiddlewareBuilder | |
| { | |
| /** | |
| * @var \AppKernel | |
| */ | |
| private $app; | |
| /** | |
| * @var string | |
| */ | |
| private $cacheFile; | |
| public function __construct(\AppKernel $app) | |
| { | |
| $this->app = $app; | |
| $this->cacheFile = sprintf('%s/middlewares.cache.php', $app->getCacheDir()); | |
| $this->specs = new \SplPriorityQueue(); | |
| } | |
| public function resolve(): StackedHttpKernel | |
| { | |
| $this->loadMiddlewares(); | |
| $app = $this->app; | |
| $middlewares = [$app]; | |
| foreach ($this->specs as $spec) { | |
| $app = $spec->newInstanceArgs([$app]); | |
| array_unshift($middlewares, $app); | |
| } | |
| return new StackedHttpKernel($app, $middlewares); | |
| } | |
| private function loadMiddlewares(): void | |
| { | |
| if (!$this->hasCacheFile()) { | |
| $this->warmUpCacheCommand(); | |
| } | |
| $this->loadCacheFile(); | |
| } | |
| private function warmUpCacheCommand(): void | |
| { | |
| $middlewareCacheWarmer = new MiddlewareCacheWarmer($this->app->getEnvironment()); | |
| $middlewareCacheWarmer->warmUp($this->app->getCacheDir()); | |
| } | |
| private function hasCacheFile(): bool | |
| { | |
| return file_exists($this->cacheFile); | |
| } | |
| private function loadCacheFile(): void | |
| { | |
| /** @var array $middlewares */ | |
| $middlewares = include $this->cacheFile; | |
| foreach ($middlewares as $middleware) { | |
| $this->push($middleware); | |
| } | |
| } | |
| private function push(string $middlewareClass): void | |
| { | |
| try { | |
| $reflection = new \ReflectionClass($middlewareClass); | |
| $priority = $reflection->getConstant('PRIORITY'); | |
| $this->specs->insert($reflection, $priority); | |
| } catch (\ReflectionException $e) { | |
| /* If there's an error getting the kernel class, it's | |
| * an invalid middleware. If it's invalid, don't push | |
| * it to the stack | |
| */ | |
| } | |
| } | |
| } | |