Атрибут Cache
Атрибут Cache вешается на метод
контроллера и сохраняет результат его работы
в кэш. Первым параметром передаётся время
жизни кэша в секундах. После истечения этого
времени Symfony заново выполнит метод и
обновит кэш. Если кэш ещё актуален, метод
не вызывается, а ответ берётся из хранилища.
Синтаксис
#[Cache(expires: time, public: bool, smaxage: int, maxage: int, vary: array)]
Пример
Давайте закэшируем результат метода на 60 секунд:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
use SymfonyComponentCacheAttributeCache;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
#[Cache(expires: 60)]
public function index(): Response
{
return new Response('article');
}
}
?>
Результат выполнения кода:
article
Пример
Давайте сделаем кэш публичным и зададим время жизни на стороне клиента:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
use SymfonyComponentCacheAttributeCache;
class ArticleController extends AbstractController
{
#[Route('/user', name: 'article_user')]
#[Cache(expires: 3600, public: true, maxage: 600, smaxage: 900)]
public function user(): Response
{
return new Response('user');
}
}
?>
Результат выполнения кода:
user
Пример
Давайте зададим заголовки Vary, чтобы
кэш зависел от принимаемых типов контента:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
use SymfonyComponentCacheAttributeCache;
class ArticleController extends AbstractController
{
#[Route('/hello', name: 'article_hello')]
#[Cache(expires: 120, vary: ['Accept', 'Accept-Language'])]
public function hello(): Response
{
return new Response('hello');
}
}
?>
Результат выполнения кода:
hello
Пример
Давайте проверим работу кэша, увеличив счётчик вызовов метода:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
use SymfonyComponentCacheAttributeCache;
class ArticleController extends AbstractController
{
#[Route('/counter', name: 'article_counter')]
#[Cache(expires: 300)]
public function counter(): Response
{
$count = random_int(1, 100);
return new Response((string) $count);
}
}
?>
Первый запрос вернёт случайное число, например:
42
Повторный запрос в течение 300 секунд вернёт то же самое число, так как метод не будет вызван повторно.
Смотрите также
-
атрибут
MapRequestPayload,
который привязывает тело запроса к объекту -
атрибут
MapQueryString,
который привязывает query-параметры к объекту -
атрибут
MapQueryParameter,
который привязывает отдельный query-параметр -
атрибут
MapEntity,
который автоматически загружает сущность из базы