在Symfony2中读写Cookie

时间:2011-10-11 14:12:56

标签: cookies symfony

我想在本地浏览器cookie中存储一些信息。经过几个小时寻找一个很好的教程,我设法将一些数据存储在非会话cookie中:

controller - indexAction()

$cookieGuest = array(
    'name'  => 'mycookie',
    'value' => 'testval',
    'path'  => $this->generateUrl('my_route'),
    'time'  => time() + 3600 * 24 * 7
);

$cookie = new Cookie($cookieGuest['name'], $cookieGuest['value'], $cookieGuest['time'], $cookieGuest['path']);

$response = new Response();
$response->headers->setCookie($cookie);
$response->send();

我想知道这是否正确。此外,我尝试了几种方法来使用HttpFoundation组件读取cookie,但没有成功。除了通过 $ _ COOKIE ['mycookie'] 访问cookie之外还有其他方法吗?

这是我尝试阅读cookie的地方

controller - cookieAction()

public function cookieAction($_locale, $branch, $page) 
{   
    $response = new Response();
    $cookies = $response->headers->getCookies();

    var_dump($cookies);

// TODO: Get params for indexAction from cookie if available

    return $this->indexAction($_locale, $branch, $page);
}

6 个答案:

答案 0 :(得分:70)

这是设置cookie的正确方法。 要读取已在浏览器中编写的cookie,请执行以下操作:

$request->cookies->get('myCookie');

但是我在$ response对象中创建了cookie之后:

$cookie = new Cookie('myCookie', 'contentOfMyCookie');
$response = new Response();
$response->headers->setCookie($cookie);

我称这种方法为:

$response->headers->getCookies();

我得到了一系列cookie,这些cookie将在浏览器中编写 - 而不是那些已经存在的cookie。

形象地说,$ request和$ response之间有执行控制器代码的时间。

此外,在树枝模板中,您可以使用

{{ app.request.cookies.get('myCookie') }}

因此,你获得了已经在浏览器中编写的cookie的价值,而不是来自$ response对象的价值!来自浏览器的新创建的cookie只有在重新加载页面后才能读取(ajax不需要重新加载整个页面)。

总结一下,您可以使用 $ request 对象读取Cookie ,并使用 $ response 创建 >对象。 (显然,出于某些原因,您还可以阅读$ response对象cookie - 但这些情况非常罕见)。

答案 1 :(得分:17)

$response->headers->getCookies();

应该在ResponseHeaderBag类中返回一个cookie数组,以获取有关该函数的更多信息

答案 2 :(得分:17)

这对于尝试在symfony2中制作Cookie的人有用:

use Symfony\Component\HttpFoundation\Cookie;

答案 3 :(得分:5)

如何使用Cookie和会话示例:

<?php

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Response;

class DefaultController extends Controller
{
    public function indexAction()
    {
        // Set session value
        $session = $this->getRequest()->getSession();
        $session->set('test', 1);

        // Get session value
        $value = $session->get('test');

        // Set cookie value
        $response = new Response();
        $cookie = new Cookie('test', 1, time()+3600);
        $response->headers->setCookie($cookie);

        // Get cookie value
        $this->getRequest()->cookies->get('test');
    }
}

答案 4 :(得分:2)

            use Symfony\Component\HttpFoundation\Cookie;
            use Symfony\Component\HttpFoundation\Response;

            // set current active tab in cookie 
            $cookie = new Cookie('myProfileActiveTab', 'myaddress', strtotime('now + 60 minutes'));
            $response = new Response();
            $response->headers->setCookie($cookie);
            $response->send();


           // get current active tab from cookies
           $cookies = $request->cookies;
           if ($cookies->has('myProfileActiveTab')) {
               $activetab = $cookies->get('myProfileActiveTab');
           } 

答案 5 :(得分:1)

更有趣的cookie信息链接(symfony2的http_fundation组件):

Symfony2 http_fundation component

Symfony2 http_fundation api

Symfony2 http_fundation component (spanish)