Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Read and Write Cookie in Symfony2

I want to store some information in the local browser cookie. After hours looking for a nice tutorial, I managed to store some data in a non-session 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();

I wonder if this is the correct way. Furthermore I tried several ways to read the cookie with the HttpFoundation Component, but without success. Is there another way than accessing the cookie via $_COOKIE['mycookie'] ?

Here is where I try to read the 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);
}
like image 941
Ben Avatar asked Oct 11 '11 14:10

Ben


3 Answers

This is the correct way of setting cookie. To read cookie already written in the browser do:

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

But after I created cookie in the $response object:

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

I call this method:

$response->headers->getCookies();

I get an array of cookies, which are to be written in the browser - not those already existing there.

Figuratively, between $request and $response there is a time of executing controller's code.

Besides, in a twig template you can use

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

you thus get value of the cookie already written in the browser, not that from the $response object! Newly created cookie from the browser you can read only after having reloaded page (ajax doesn't need to reload whole page).

To sum it up, you can read cookies using $request object, and create them with $response object. (Obviously, for some reasons, you can also read $response object cookies - but these are rather rare situations).

like image 184
Błażej Kocik Avatar answered Nov 20 '22 05:11

Błażej Kocik


$response->headers->getCookies();

should return an array of cookies look in ResponseHeaderBag class for more information about that function

like image 17
Miguelo Avatar answered Nov 20 '22 05:11

Miguelo


this can be useful for someone trying to make cookies in symfony2 :

use Symfony\Component\HttpFoundation\Cookie;
like image 17
Eduardo Avatar answered Nov 20 '22 04:11

Eduardo