我有一個服務,應該可以讀取和寫入cookie。要以類似Symfony的方式執行此操作,該服務必須能夠訪問請求和響應。我可以想象,可以通過服務配置將請求傳遞給服務,但我不知道如何。我不知道如何讓服務能夠編寫cookies。任何建議如何做到這一點將不勝感激。我可以給Symfony 2服務讀寫cookies的能力嗎?
注意:我真的不想在每次使用它時手動將變量傳遞給服務。
我有一個服務,應該可以讀取和寫入cookie。要以類似Symfony的方式執行此操作,該服務必須能夠訪問請求和響應。我可以想象,可以通過服務配置將請求傳遞給服務,但我不知道如何。我不知道如何讓服務能夠編寫cookies。任何建議如何做到這一點將不勝感激。我可以給Symfony 2服務讀寫cookies的能力嗎?
注意:我真的不想在每次使用它時手動將變量傳遞給服務。
我認爲你真的有幾個選擇 - 這取決於你試圖存儲在一個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。
一些鏈接到一些有用的文檔閱讀:
HTTP在HTTP相關事件的控制器和聽衆停止。服務(不是控制器或HTTP事件偵聽器)不應設置或獲取cookie。相反,控制器應該處理cookie。它在使用接受它作爲參數的服務方法並返回其新值或使用by-reference參數之前從cookie中獲取數據。這樣,您的服務就與HTTP解耦,並且可以輕鬆地重新使用和測試。
響應事件偵聽器看起來像是完美的解決方案!謝謝。 – Hubro 2013-05-14 15:32:35