2013-05-14 36 views
5

我有一個服務,應該可以讀取和寫入cookie。要以類似Symfony的方式執行此操作,該服務必須能夠訪問請求和響應。我可以想象,可以通過服務配置將請求傳遞給服務,但我不知道如何。我不知道如何讓服務能夠編寫cookies。任何建議如何做到這一點將不勝感激。我可以給Symfony 2服務讀寫cookies的能力嗎?

注意:我真的不想在每次使用它時手動將變量傳遞給服務。

回答

12

我認爲你真的有幾個選擇 - 這取決於你試圖存儲在一個cookie中的什麼,以及在你需要閱讀的過程中的哪一點做這項工作。

我建議你的第一選擇是創建一個服務,需要有訪問請求,並創建一個響應,它返回......

定義您的服務services.yml:

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

您的類:

//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監聽器可以訪問請求和響應中的所有內容 - 您可以檢查響應是否與預期一致(即格式或內容),然後根據此設置cookie。

一些鏈接到一些有用的文檔閱讀:

+2

響應事件偵聽器看起來像是完美的解決方案!謝謝。 – Hubro 2013-05-14 15:32:35

1

HTTP在HTTP相關事件的控制器和聽衆停止。服務(不是控制器或HTTP事件偵聽器)不應設置或獲取cookie。相反,控制器應該處理cookie。它在使用接受它作爲參數的服務方法並返回其新值或使用by-reference參數之前從cookie中獲取數據。這樣,您的服務就與HTTP解耦,並且可以輕鬆地重新使用和測試。

相關問題