Spaces:
No application file
No application file
File size: 2,115 Bytes
d2897cd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
<?php
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
*/
}
}
}
|