Php 我可以为Symfony 2服务提供读写cookie的能力吗?

Php 我可以为Symfony 2服务提供读写cookie的能力吗?,php,symfony,cookies,Php,Symfony,Cookies,我有一个服务,应该能够读和写饼干。要以类似Symfony的方式执行此操作,服务必须能够访问请求和响应。我可以想象,可以通过服务配置将请求传递给服务,但我不知道如何传递。不过,我不确定我将如何赋予服务编写cookie的能力。如有任何关于如何做到这一点的建议,将不胜感激 注意:我真的不希望每次使用服务时都必须手动将变量传递给服务。我认为您确实有两个选择—这取决于您试图在cookie中存储的内容以及您需要在过程中的什么时候读取并执行该工作 我建议您的第一个选择是创建一个服务,它可以访问请求并创建一个响

我有一个服务,应该能够读和写饼干。要以类似Symfony的方式执行此操作,服务必须能够访问请求和响应。我可以想象,可以通过服务配置将请求传递给服务,但我不知道如何传递。不过,我不确定我将如何赋予服务编写cookie的能力。如有任何关于如何做到这一点的建议,将不胜感激


注意:我真的不希望每次使用服务时都必须手动将变量传递给服务。

我认为您确实有两个选择—这取决于您试图在cookie中存储的内容以及您需要在过程中的什么时候读取并执行该工作

我建议您的第一个选择是创建一个服务,它可以访问请求并创建一个响应,然后返回

在services.yml中定义您的服务:

services:
    a_service:
        class:     Acme\DemoBundle\RequestServiceClass
        arguments: [@request]
        scope: request
services:
  a_listener:
    class: Acme\DemoBundle\MyListener
    tags:
      - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse }
你们班:

//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;
}
另一种方法是创建
内核.response
侦听器。。。它是这样做的:

// 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);
    }
}
将服务添加到services.yml:

services:
    a_service:
        class:     Acme\DemoBundle\RequestServiceClass
        arguments: [@request]
        scope: request
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获取数据,这些方法将数据接受为参数并返回其新值或使用by引用参数。通过这种方式,您的服务与HTTP分离,并且可以轻松地重新使用和测试。

响应事件侦听器看起来是完美的解决方案!谢谢