2013-05-14 5 views
5

私は、クッキーを読み書きできるサービスがあります。 Symfonyのような方法でこれを行うには、サービスがリクエストとレスポンスにアクセスできる必要があります。私はそれがサービス構成を介して要求をサービスに渡すことが可能であると想像することができますが、私は方法を知らない。私はどのようにサービスをクッキーを書く能力を与えるつもりだか分からない。これを行う方法についてのご意見は高く評価されます。Symfony 2サービスにクッキーの読み書き機能を与えることはできますか?

注:私は実際に使用するたびに変数をサービスに手動で渡す必要はありません。

答えて

12

私はあなたに本当にいくつかのオプションがあると思います - それは実際にあなたがクッキーに保存しようとしていることと、作業のどの時点で作業を行う必要があるのか​​によって異なります。

services: 
    a_service: 
     class:  Acme\DemoBundle\RequestServiceClass 
     arguments: [@request] 
     scope: request 

は私が

services.ymlであなたのサービスを定義します...あなたの最初のオプションは、その要求にアクセスしており、それが返すレスポンスを作成し、サービスを作成することであることを示唆しています

あなたのクラス:次に

//Acme\DemoBundle\RequestServiceClass.php 
class RequestServiceClass 
{ 
    private $request; 
    public function __construct(Request $request){ 
     $this->request= $request; 
    } 

    public function doSomething(){ 
     // get cookie 
     $value = $this->request->cookies->get('cookie'); 

     // create cookie 
     $cookie = new Cookie('cookie', 'value', time() + 3600 * 24 * 7); 
     // create response 
     $response = new Response(); 
     // set cookie in response 
     $response->headers->setCookie($cookie); 
     return $response; 
    } 
} 

あなたのサービスを使用するには、あなたがこの

ような何かを行います
public myAction() 
{ 
    $response = $this->get('a_service')->doSomething(); 
    return $response; 
} 

それを行うための他の方法、kernel.responseリスナーを作成している...その次のように行わ:

はservices.ymlするサービスを追加します。

services: 
    a_listener: 
    class: Acme\DemoBundle\MyListener 
    tags: 
     - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse } 

あなたのリスナクラスは、このようになります。 :

// Acme\DemoBundle\MyListener.php 

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

     // get cookie 
     $value = $request->cookies->get('cookie'); 

     // create cookie 
     $cookie = new Cookie('cookie', 'value', time() + 3600 * 24 * 7); 
     // set cookie in response 
     $response->headers->setCookie($cookie); 
    } 
} 

2つの方法の違いは、処理の際に利用可能なものの情報である - たとえばサービスは、あなたがそれを渡すすべてにアクセス権を持っている... RESPO nseリスナーは、リクエストとレスポンスのすべてにアクセスできます。レスポンスが期待通りのものかどうか(つまり、フォーマットやコンテンツ)を確認し、それに従ってクッキーを設定することができます。

読むためにいくつかの有用なドキュメントへのリンク:

+2

応答イベントリスナーは完璧なソリューションのようです。ありがとう。 – Hubro

1

HTTPは、HTTP関連のイベントのコントローラとリスナーで停止します。サービス(コントローラまたはHTTPイベントリスナーではない)は、クッキーを設定または取得してはいけません。代わりにコントローラはクッキーを処理する必要があります。これは、引数として受け入れて新しい値を返すサービスのメソッドを消費する前に、クッキーからデータを取得します。このようにして、サービスはHTTPから切り離され、テスト済みのものを簡単に再利用できます。

関連する問題