Acceso a la sesión desde la plantilla de twig
Pregunta
He buscado mucho en la red cómo acceder al global $_SESSION
matriz de plantilla de twig y encontré esto: {{app.session.get('index')}}
, pero cuando lo llamo, devuelve una cadena vacía. tengo un $_SESSION['filter']['accounts']
Y recibo este error al llamar {{app.session.get('filter').accounts}}
: Item "accounts" for "" does not exist
. ¿Qué estoy haciendo mal?
Solución
{{app.session}}
se refiere a Session
objeto y no el $_SESSION
formación. No creo que el $_SESSION
La matriz es accesible a menos que la pase explícitamente a cada plantilla de ramas o si hace una extensión que la ponga a disposición.
Symfony2 está orientado a objetos, por lo que debe usar el Session
OBJETO para establecer los atributos de la sesión y no confiar en la matriz. los Session
El objeto abstrae estas cosas de usted para que sea 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.
Entonces, configure su atributo en la sesión y recupere el valor en su plantilla de ramita utilizando el Session
objeto.
// 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,
Mate
Otros consejos
Configurar ramita
$twig = new Twig_Environment(...);
$twig->addGlobal('session', $_SESSION);
Luego, dentro de su plantilla, los valores de la sesión de acceso, por ejemplo,
$_SESSION['username'] in php file Will be equivalent to {{ session.username }} in your twig template
Un truco simple es definir la matriz de $ _session como una variable global. Para eso, edite el archivo core.php en la carpeta de extensión agregando esta función:
public function getGlobals() {
return array(
'session' => $_SESSION,
) ;
}
Luego, podrá acceder a cualquier variable de sesión como:
{{ session.username }}
Si quieres acceder a
$_SESSION['username']
La forma de acceder a una variable de sesión en Twig es:
{{ app.session.get('name_variable') }}
Descubrí que la forma más limpia de hacer esto es crear un twigextension personalizado y anular su getGlobals()
método. En lugar de usar $_SESSION
, también es mejor usar Symfony's Session
clase ya que maneja automáticamente iniciando/deteniendo 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 }
Luego se puede acceder a la sesión desde cualquier vista usando:
{{ session.my_variable }}
¿Por qué no usa {{app.object name.field name}} para acceder a la variable?