2011-12-06 14 views
45

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

+10

¡NO use $ _SESSION en Symfony! – Gigala

Respuesta

118

{{app.session}} se refiere al objeto Session y no al conjunto $_SESSION. No creo que se pueda acceder al conjunto $_SESSION a menos que lo transfiera explícitamente a cada plantilla Twig o si hace 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 extraerá estas cosas de usted, por lo que es más fácil, por ejemplo, almacenar la sesión en una base de datos porque el almacenamiento de la variable de sesión está oculto para usted.

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

+1

gracias :) esto me ayudó P.S. necesita cambiar su respuesta como esta: '$ session-> set ('filter', array ('accounts' => 'value'));' – haynar

+0

¿Qué sucede si las sesiones están almacenadas en Memcached? – Sekai

+0

@Sekai no hace una diferencia diría que si lo configuró correctamente – Gigala

20

Un truco sencillo es definir la matriz $ _SESSION como una variable global. Para ello, editar el archivo en la carpeta core.php extensión mediante la adición de esta función:

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

A continuación, podrás acces a cualquier variable de sesión como:

{{ session.username }} 

si quieres acceda a

$_SESSION['username'] 
+6

Esta es una respuesta mucho mejor que la anterior, dado que puede estar usando Twig sin usar Symfony. – gazarsgo

+6

En lugar de editar core.php, siga los documentos aquí: http://twig.sensiolabs.org/docnced.html – gazarsgo

+2

@gazarsgo Ambas soluciones son geniales. – pregmatch

0

¿Por qué no usa {{app.object name.field name}} para acceder a la variable?

5

Encontré que la forma más limpia de hacer esto es crear un TwigExtension personalizado 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'; 
    } 
} 

A continuación, agregue esto en /app/config/servicios.yml:

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

A continuación, la sesión se puede acceder desde cualquier punto de vista usando:

{{ session.my_variable }} 
+0

Thx para esta excelente solución – Elium1984

+0

Esto es bueno. ¿Cómo puedo establecer una variable de sesión en twig usando esta solución? – Ranhot

+0

@Ranhot, no debe establecer variables de sesión en vistas de ramitas. Eso debería hacerse en controladores o servicios. –

12

Configuración ramita

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

Luego, dentro de sus valores de sesión de acceso plantilla por ejemplo

$_SESSION['username'] in php file Will be equivalent to {{ session.username }} in your twig template 
+0

Esta es una gran respuesta. – VSG24

+0

Sí, excelente respuesta. – JimB814

+0

¡Gracias! @ user1279047 –

7

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

{{ app.session.get('name_variable') }} 
Cuestiones relacionadas