2016-10-12 8 views
0

symfonyコントローラ注釈で特定のステータスコードに対してのみキャッシュヘッダを設定する方法はありますか?Symfony:特定のステータスコードのみの注釈を使用してキャッシュヘッダを設定する

私は現在SensioFrameworkExtraBundleによって提供されたアノテーションを利用して、以下のコードのようにそれをやっている:

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

しかし、この注釈は関係なく、どのような状態コードすべての応答のためのキャッシュ・ヘッダーを設定します。特定のステータスコードに対してのみキャッシュヘッダーを設定したいと思います。

+0

を他のどのような状態コードあなたが参照しているとどのようにこれらを設定していますか? – Gerry

+0

たとえば、404エラーでもこれらのキャッシュヘッダーが取得されます。特に、私はHttpNoutFound例外を投げて404応答を作成します。 – Thomas

答えて

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 } 
+0

ありがとうございました!私はそれがまさに私がやろうとしていることだと思います。私はちょうどアノテーションを使って解決策があると思った。 – Thomas

関連する問題