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?

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top