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

时间:2013-05-14 06:34:28

标签: php symfony cookies

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

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

2 个答案:

答案 0 :(得分: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);
    }
}

两种方法之间的区别在于处理过程中可用的信息 - 例如,服务可以访问您传递的所有内容......响应侦听器可以访问请求中的所有内容和响应 - 您可以检查响应是否符合预期(即格式或内容),然后根据该响应设置cookie。

一些有用文档的链接可供阅读:

答案 1 :(得分:1)

HTTP停止在HTTP相关事件的控制器和侦听器上。服务(不是控制器或HTTP事件侦听器)不应设置或获取cookie。相反,控制器应该处理cookie。它在使用服务的方法之前从cookie获取数据,该方法接受它作为参数并返回其新值或使用by-reference参数。这样,您的服务就可以与HTTP分离,并且可以轻松地重复使用和测试。