40 lines
1.4 KiB
PHP
40 lines
1.4 KiB
PHP
<?php declare(strict_types=1);
|
|
|
|
namespace Lubian\NoFramework\Middleware;
|
|
|
|
use Laminas\Diactoros\Response;
|
|
use Lubian\NoFramework\Settings;
|
|
use Psr\Http\Message\ResponseInterface;
|
|
use Psr\Http\Message\ServerRequestInterface;
|
|
use Psr\Http\Server\MiddlewareInterface;
|
|
use Psr\Http\Server\RequestHandlerInterface;
|
|
use Symfony\Contracts\Cache\CacheInterface;
|
|
use Symfony\Contracts\Cache\ItemInterface;
|
|
|
|
use function base64_encode;
|
|
|
|
final class CacheMiddleware implements MiddlewareInterface
|
|
{
|
|
public function __construct(
|
|
private CacheInterface $cache,
|
|
private Response\Serializer $serializer,
|
|
private Settings $settings,
|
|
) {
|
|
}
|
|
|
|
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
|
|
{
|
|
if ($request->getMethod() === 'GET' && ! $this->settings->isDev()) {
|
|
$key = (string) $request->getUri();
|
|
$key = base64_encode($key);
|
|
$callback = fn () => $handler->handle($request);
|
|
$cached = $this->cache->get($key, function (ItemInterface $item) use ($callback) {
|
|
$item->expiresAfter(120);
|
|
$response = $callback();
|
|
return $this->serializer::toString($response);
|
|
});
|
|
return $this->serializer::fromString($cached);
|
|
}
|
|
return $handler->handle($request);
|
|
}
|
|
}
|