Symfony:仅针对特定状态代码

时间:2016-10-12 11:54:00

标签: php symfony caching http-status-codes cache-control

有没有办法在symfony控制器注释中为特定的状态代码设置缓存头?

我目前正在使用SensioFrameworkExtraBundle提供的注释,就像在下面的代码中那样:

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

但无论状态代码是什么,此注释都会为所有响应设置缓存标头。我想仅为特定的状态代码设置缓存标头。

1 个答案:

答案 0 :(得分:1)

查看SensioFrameworkExtraBundle中的代码,最直接的解决方案是不使用注释,而是在响应上手动设置缓存头(例如在控制器或事件监听器中),或创建一个事件监听器阻止SensioFrameworkExtraBundle设置缓存标头。

关于第二个选项,查看代码(https://github.com/sensiolabs/SensioFrameworkExtraBundle/blob/master/EventListener/HttpCacheListener.php#L86-L88),您可以在触发HttpCacheListener之前取消设置_cache请求属性。

<?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 }