Symfony: установите заголовки кэша с помощью аннотаций только для определенных кодов состояния

Есть ли способ установить заголовки кэша в аннотациях контроллера Symfony только для определенных кодов состояния?

В настоящее время я делаю это, как в коде ниже, используя аннотации, предоставленные SensioFrameworkExtraBundle:

 /**
* @Get("", name="product.list")
* @Cache(public=true, maxage="432000", smaxage="432000")
*/
public function listAction()
{
// ...
}

Но эта аннотация устанавливает заголовки кэша для всех ответов независимо от того, какой код состояния. Я хотел бы установить заголовки кэша только для конкретных кодов состояния.

0

Решение

Глядя на код в SensioFrameworkExtraBundle, самым простым решением было бы либо не использовать аннотации, но и вручную устанавливать заголовки кэша в ответе (например, в контроллере или прослушивателе событий) или создать прослушиватель событий, который предотвращает SensioFrameworkExtraBundle установить заголовки кэша.

По поводу второго варианта, глядя на код (https://github.com/sensiolabs/SensioFrameworkExtraBundle/blob/master/EventListener/HttpCacheListener.php#L86-L88), вы можете сбросить _cache Атрибут запроса до срабатывания HttpCacheListener.

<?php

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class MyCacheListener implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
KernelEvents::RESPONSE => ['onKernelResponse', 16] // use a priority higher than the HttpCacheListener
];
}

public function onKernelResponse(FilterResponseEvent $event)
{
$request = $event->getRequest();
$response = $event->getResponse();

if (!$response->isSuccessful()) {
$request->attributes->remove('_cache');
}
}
}

Зарегистрируйте подписчика на событие, например, в services.yml:

services:
my_cache_listener:
class: MyCacheListener
tags:
- { name: kernel.event_subscriber }
1

Другие решения

Других решений пока нет …