Ben
Ben

Reputation: 806

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

Upvotes: 28

Views: 76636

Answers (6)

Ankit Suthar
Ankit Suthar

Reputation: 181

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

Upvotes: 3

tomazahlin
tomazahlin

Reputation: 2167

Example how to use Cookies and Session:

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

Upvotes: 5

Błażej Kocik
Błażej Kocik

Reputation: 1699

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).

Upvotes: 79

Santi
Santi

Reputation: 509

More interesting cookies information links (http_fundation component for symfony2):

Symfony2 http_fundation component

Symfony2 http_fundation api

Symfony2 http_fundation component (spanish)

Upvotes: 1

Eduardo Moniz
Eduardo Moniz

Reputation: 2115

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

use Symfony\Component\HttpFoundation\Cookie;

Upvotes: 17

Miguelo
Miguelo

Reputation: 1078

$response->headers->getCookies();

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

Upvotes: 17

Related Questions