2011-10-11 24 views
26

Quiero almacenar cierta información en la cookie del navegador local. Después de horas en busca de un buen tutorial, me las arreglé para almacenar algunos datos en una cookie no sesión:Leer y escribir cookies en Symfony2

controlador - 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(); 

Me pregunto si esta es la forma correcta. Además, probé varias formas de leer la cookie con HttpFoundation Component, pero sin éxito. ¿Hay otra forma de acceder a la cookie a través del $ _COOKIE ['mycookie']?

Aquí es donde trato de leer la cookie

controlador - 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

cotización de cierre de una falta en 'testval' (tercera fila). No puedo editarlo en tu nombre porque una edición necesita 6 caracteres – Bertuz

Respuesta

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

debe devolver una matriz de galletas de buscar en la clase ResponseHeaderBag para obtener más información acerca de esa función

+0

Este método devuelve una matriz vacía. – Ben

+0

podría publicar el código donde intenta recuperar la cookie – Miguelo

+0

Acabo de agregar el código a mi publicación inicial. – Ben

16

esto puede ser útil para alguien que intenta hacer cookies en symfony2:

use Symfony\Component\HttpFoundation\Cookie; 
+1

gracias, me ayudó :) – Gigala

67

Esta es la forma correcta de establecer cookies. Para leer cookies ya escrito en el navegador hacer:

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

Pero después de haber creado la galleta en el objeto $ respuesta:

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

me llama a este método:

$response->headers->getCookies(); 

consigo una serie de cookies, que deben escribirse en el navegador, no las que ya existen allí.

Figurativamente, entre $ solicitud y $ respuesta hay un momento de ejecución del código del controlador.

Además, en una plantilla ramita puede utilizar

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

que de este modo obtener el valor de la cookie ya escrito en el navegador, no es que desde el objeto $ respuesta! Cookie recién creada desde el navegador que puede leer solo después de haber recargado la página (ajax no necesita volver a cargar toda la página).

Para resumir, se puede leer las cookies usando $ solicitud objeto y crear con $ respuesta objeto. (Obviamente, por alguna razón, también puede leer las cookies objeto $ respuesta, pero estas son situaciones bastante raras).

3

ejemplo de cómo utilizar cookies y Sesión:

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