Accessing session from TWIG template
Solution 1
{{app.session}}
refers to the Session
object and not the $_SESSION
array. I don't think the $_SESSION
array is accessible unless you explicitly pass it to every Twig template or if you do an extension that makes it available.
Symfony2 is object-oriented, so you should use the Session
object to set session attributes and not rely on the array. The Session
object will abstract this stuff away from you so it is easier to, say, store the session in a database because storing the session variable is hidden from you.
So, set your attribute in the session and retrieve the value in your twig template by using the Session
object.
// In a controller
$session = $this->get('session');
$session->set('filter', array(
'accounts' => 'value',
));
// In Twig
{% set filter = app.session.get('filter') %}
{% set account-filter = filter['accounts'] %}
Hope this helps.
Regards,
Matt
Solution 2
Setup twig
$twig = new Twig_Environment(...);
$twig->addGlobal('session', $_SESSION);
Then within your template access session values for example
$_SESSION['username'] in php file Will be equivalent to {{ session.username }} in your twig template
Solution 3
A simple trick is to define the $_SESSION array as a global variable. For that, edit the core.php file in the extension folder by adding this function :
public function getGlobals() {
return array(
'session' => $_SESSION,
) ;
}
Then, you'll be able to acces any session variable as :
{{ session.username }}
if you want to access to
$_SESSION['username']
Solution 4
The way to access a session variable in Twig is:
{{ app.session.get('name_variable') }}
Solution 5
I found that the cleanest way to do this is to create a custom TwigExtension and override its getGlobals()
method. Rather than using $_SESSION
, it's also better to use Symfony's Session
class since it handles automatically starting/stopping the session.
I've got the following extension in /src/AppBundle/Twig/AppExtension.php:
<?php
namespace AppBundle\Twig;
use Symfony\Component\HttpFoundation\Session\Session;
class AppExtension extends \Twig_Extension {
public function getGlobals() {
$session = new Session();
return array(
'session' => $session->all(),
);
}
public function getName() {
return 'app_extension';
}
}
Then add this in /app/config/services.yml:
services:
app.twig_extension:
class: AppBundle\Twig\AppExtension
public: false
tags:
- { name: twig.extension }
Then the session can be accessed from any view using:
{{ session.my_variable }}
haynar
Updated on December 01, 2020Comments
-
haynar over 3 years
I've searched a lot on the net how to access the global
$_SESSION
array from TWIG template and found this:{{app.session.get('index')}}
, but when I'm calling it, it returns an empty string. I have a$_SESSION['filter']['accounts']
and I'm getting this error when calling{{app.session.get('filter').accounts}}
:Item "accounts" for "" does not exist
. What I'm doing wrong? -
haynar over 12 yearsthanks :) this helped me P.S. you need to change your answer as this:
$session->set('filter', array( 'accounts' => 'value' ));
-
gazarsgo over 11 yearsThis is a much better answer than the above, given that you can be using Twig without using Symfony.
-
gazarsgo over 11 yearsRather than edit core.php though follow the docs here: twig.sensiolabs.org/doc/advanced.html
-
pregmatch over 10 years@gazarsgo Both solutions are just great.
-
Aysennoussi almost 10 yearsWhat if sessions are stored in Memcached ?
-
Gigala almost 9 years@Sekai doesnt make a differnce i would say if you configured it correctly
-
Vahid Amiri over 7 yearsThis is a great answer.
-
JimB814 over 7 yearsYes, great answer.
-
Ranhot over 6 yearsThis is nice. How can i set a session variable in twig using this solution??
-
laurent over 6 years@Ranhot, you shouldn't set session variables in twig views. That should be done in controllers or services.
-
migli about 6 yearsYes, great answer
-
alttag about 5 yearsGreat answer because it works without Symphony. Not shown is how to do this within the view container, which is very similar. Where
$view
is the newly created Twig object, add the following to the container function (the same place you might add extensions).$view->getEnvironment()->addGlobal('session', $_SESSION);
-
Olu Adeyemo over 4 yearsThis code does not work in the latest Twig version. @user1279047
-
Prawny almost 3 yearsThis solution does still work with Twig 3.x - the
Twig_Environment
class has been changed to justEnvironment
.