我有一个应该能够读取和写入 cookie 的服务。要以类似 Symfony 的方式执行此操作,服务必须有权访问请求和响应。我可以想象通过服务配置将请求传递给服务是可能的,但我不知道如何。不过,我不确定如何让服务能够编写 cookie。任何有关如何执行此操作的建议将不胜感激。
注意:我真的不想每次使用它时都必须手动将变量传递给服务。
我认为您确实有几个选择 - 这实际上取决于您尝试在 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);
}
}
两种方法之间的区别在于处理时可用的信息 - 例如,服务可以访问您传递给它的所有内容......响应侦听器可以访问请求和响应中的所有内容 - 您可以检查是否响应符合预期(即格式或内容),然后据此设置cookie。
一些有用文档的链接可供阅读:
HTTP 在 HTTP 相关事件的控制器和侦听器处停止。服务(不是控制器或 HTTP 事件侦听器)不应设置或获取 cookie。相反,控制器应该处理 cookie。它在使用接受它作为参数并返回其新值或使用引用参数的服务方法之前从 cookie 获取数据。通过这种方式,您的服务与 HTTP 分离,并且可以轻松地重复使用和测试。</p>