Spaces:
No application file
No application file
| declare(strict_types=1); | |
| namespace Mautic\CoreBundle\Cache; | |
| use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface; | |
| class MiddlewareCacheWarmer implements CacheWarmerInterface | |
| { | |
| private ?string $cacheFile = null; | |
| /** | |
| * @var \SplPriorityQueue|\ReflectionClass[] | |
| */ | |
| private \SplPriorityQueue $specs; | |
| public function __construct( | |
| private string $env | |
| ) { | |
| $this->specs = new \SplPriorityQueue(); | |
| } | |
| /** | |
| * @inerhitDoc | |
| */ | |
| public function warmUp(string $cacheDirectory) | |
| { | |
| $this->cacheFile = sprintf('%s/middlewares.cache.php', $cacheDirectory); | |
| $this->createCacheFile($cacheDirectory); | |
| return []; | |
| } | |
| public function isOptional(): bool | |
| { | |
| return false; | |
| } | |
| private function createCacheFile($cacheDirectory): void | |
| { | |
| $middlewarsDir = __DIR__.'/../../../middlewares'; | |
| $this->loadFromDirectory($middlewarsDir); | |
| $envDir = $middlewarsDir.'/'.ucfirst($this->env); | |
| if (file_exists($envDir)) { | |
| $this->loadFromDirectory($envDir, $this->env); | |
| } | |
| if (file_exists($this->cacheFile)) { | |
| unlink($this->cacheFile); | |
| } | |
| if (false === file_exists($cacheDirectory)) { | |
| mkdir($cacheDirectory, 0777, true); | |
| } | |
| $data = []; | |
| $this->specs->setExtractFlags(\SplPriorityQueue::EXTR_DATA); | |
| /** @var \ReflectionClass $middleware */ | |
| foreach ($this->specs as $middleware) { | |
| $data[] = $middleware->getName(); | |
| } | |
| $content = sprintf('<?php return %s;', var_export($data, true)); | |
| file_put_contents($this->cacheFile, $content); | |
| } | |
| private function loadFromDirectory(string $directory, ?string $env = null): void | |
| { | |
| $glob = glob($directory.'/*Middleware.php'); | |
| if (!empty($glob)) { | |
| $this->addMiddlewares($glob, $env); | |
| } | |
| } | |
| private function addMiddlewares(array $middlewares, ?string $env = null): void | |
| { | |
| $prefix = 'Mautic\\Middleware\\'; | |
| if ($env) { | |
| $prefix .= ucfirst($env).'\\'; | |
| } | |
| foreach ($middlewares as $middleware) { | |
| $this->push($prefix.basename(substr($middleware, 0, -4))); | |
| } | |
| } | |
| private function push(string $middlewareClass): void | |
| { | |
| try { | |
| $reflection = new \ReflectionClass($middlewareClass); | |
| $priority = $reflection->getConstant('PRIORITY'); | |
| $this->specs->insert($reflection, $priority); | |
| } catch (\ReflectionException) { | |
| /* 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 | |
| */ | |
| } | |
| } | |
| } | |