Acceder a la sesión desde la plantilla TWIG


He buscado mucho en la red cómo acceder al array global $_SESSION desde la plantilla TWIG y encontré esto: {{app.session.get('index')}}, pero cuando lo llamo, devuelve una cadena vacía. Tengo un $_SESSION['filter']['accounts'] y estoy recibiendo este error al llamar {{app.session.get('filter').accounts}}: Item "accounts" for "" does not exist. ¿Qué estoy haciendo mal?

Author: haynar, 2011-12-06

6 answers

{{app.session}} se refiere al objeto Session y no al array $_SESSION. No creo que el array $_SESSION sea accesible a menos que lo pases explícitamente a cada plantilla de Twig o si haces una extensión que lo haga disponible.

Symfony2 está orientado a objetos, por lo que debe usar el objeto Session para establecer atributos de sesión y no confiar en la matriz. El objeto Session abstraerá estas cosas lejos de usted por lo que es más fácil, por ejemplo, almacenar la sesión en una base de datos porque almacenar la variable de sesión es escondido de ti.

Por lo tanto, establezca su atributo en la sesión y recupere el valor en su plantilla twig utilizando el objeto Session.

// 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'] %}

Espero que esto ayude.

Saludos,
Matt

 124
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-21 13:57:42

Un truco simple es definir la matriz $_SESSION como una variable global. Para eso, edite el núcleo.archivo php en la carpeta de extensión añadiendo esta función :

public function getGlobals() {
    return array(
        'session'   => $_SESSION,
    ) ;
}

Entonces, podrás acceder a cualquier variable de sesión como:

{{ session.username }}

Si desea acceder a

$_SESSION['username']
 20
Author: Henry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-11 18:09:22

Setup twig

$twig = new Twig_Environment(...);    
$twig->addGlobal('session', $_SESSION);

Luego, dentro de su plantilla, acceda a los valores de sesión, por ejemplo

$_SESSION['username'] in php file Will be equivalent to {{ session.username }} in your twig template
 16
Author: user1279047,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-17 19:20:06

La forma de acceder a una variable de sesión en Twig es:

{{ app.session.get('name_variable') }}
 10
Author: joan16v,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-01 09:12:06

Descubrí que la forma más limpia de hacer esto es crear una extensión de ramita personalizada y anular su método getGlobals(). En lugar de usar $_SESSION, también es mejor usar la clase Session de Symfony, ya que se encarga de iniciar/detener automáticamente la sesión.

Tengo la siguiente extensión en /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';
    }
}

Luego agregue esto en /app/config/services.yml :

services:
    app.twig_extension:
        class: AppBundle\Twig\AppExtension
        public: false
        tags:
            - { name: twig.extension }

Entonces se puede acceder a la sesión desde cualquier vista usando:

{{ session.my_variable }}
 5
Author: this.lau_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-27 14:48:06

¿Por qué no usas {{ app?nombre del objeto.nombre del campo}} ¿para acceder a la variable?

 0
Author: Somnath De,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-03 09:19:57