2011-10-11 12 views
26

Desidero memorizzare alcune informazioni nel cookie del browser locale. Dopo ore alla ricerca di un bel tutorial, sono riuscito a memorizzare alcuni dati in un cookie non sessione:Leggere e scrivere cookie in Symfony2

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

Mi chiedo se questo è il modo corretto. Inoltre ho provato diversi modi per leggere il cookie con il componente HttpFoundation, ma senza successo. C'è un altro modo di accedere al cookie tramite $ _COOKIE ['mycookie']?

Qui è dove cerco di leggere il cookie

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

preventivo una chiusura manca il 'testval' (terza fila). Non posso modificarlo a tuo nome perché una modifica ha bisogno di 6 caratteri. – Bertuz

risposta

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

dovrebbe restituire una matrice di cookie guardare in classe ResponseHeaderBag per ulteriori informazioni su questa funzione

+0

Questo metodo restituisce una matrice vuota. – Ben

+0

potresti pubblicare il codice dove provare a recuperare il cookie – Miguelo

+0

Ho appena aggiunto il codice al mio post iniziale. – Ben

16

questo può essere utile per qualcuno che tenta di creare cookie in symfony2:

use Symfony\Component\HttpFoundation\Cookie; 
+1

thx, mi ha aiutato :) – Gigala

67

Questo è il modo corretto di impostare dei cookie. Per leggere biscotto già scritto nel browser fare:

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

Ma dopo che ho creato biscotto nell'oggetto $ risposta:

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

Io chiamo questo metodo:

$response->headers->getCookies(); 

ottengo una serie di cookie, che devono essere scritti nel browser, non quelli già esistenti.

In senso figurato, tra $ request e $ response vi è un momento di esecuzione del codice del controller.

Inoltre, in un modello ramoscello è possibile utilizzare

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

si ottiene in tal modo valore del cookie già scritto nel browser, non che dall'oggetto $ risposta! Cookie appena creato dal browser che puoi leggere solo dopo aver ricaricato la pagina (ajax non ha bisogno di ricaricare l'intera pagina).

Per riassumere, si può leggere i cookie utilizzando $ richiesta oggetto, e creare loro con $ risposta oggetto. (Ovviamente, per alcuni motivi, puoi anche leggere i cookie degli oggetti $ response - ma queste sono situazioni piuttosto rare).

3

Esempio come utilizzare cookie e Sessione:

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