2011-10-11 65 views
26

我想在本地浏览器cookie中存储一些信息。之后寻找一个不错的教程小时,我设法将一些数据存储在非会话cookie:在Symfony2中读写Cookie

控制器 - 的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

控制器 - 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); 
} 
+0

收盘报价上缺少'testval'(第三行)。我无法代表您编辑它,因为编辑需要6个字符 – Bertuz

回答

15
$response->headers->getCookies(); 

应该返回cookies的阵列中ResponseHeaderBag类查找有关该功能的详细信息

+0

此方法返回一个空数组。 – Ben

+0

你可以发布代码尝试检索cookie – Miguelo

+0

我只是将代码添加到我的初始文章。 – Ben

16

这对试图在symfony2中制作饼干的人有用:

use Symfony\Component\HttpFoundation\Cookie; 
+1

thx,它帮助我:) – Gigala

67

这是设置cookie的正确方法。 已经写在浏览器中读取Cookie做到:

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

但我在$响应对象创建的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值,而不是从$响应对象!刚从浏览器创建的cookie只有在重新加载页面后才能读取(ajax不需要重新加载整个页面)。

概括起来,你可以使用$请求对象读取cookies,并创建他们$响应对象。 (显然,由于某些原因,您还可以读取$响应对象cookie - 但这些情况非常罕见)。

3

示例如何使用Cookies和会话:

<?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'); 
    } 
} 
1
  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'); 
      }