ti-enxame.com

Acessando a sessão a partir do modelo TWIG

Eu pesquisei muito na net como acessar o array global $_SESSION do template TWIG e achei isso: {{app.session.get('index')}}, mas quando eu estou chamando, ele retorna uma string vazia. Eu tenho um $_SESSION['filter']['accounts'] e estou recebendo este erro ao chamar {{app.session.get('filter').accounts}}: Item "accounts" for "" does not exist. O que estou fazendo errado?

52
haynar

{{app.session}} refere-se ao objeto Session e não ao array $_SESSION. Não acho que a matriz $_SESSION esteja acessível, a menos que você a transmita explicitamente para todos os modelos Twig ou se você fizer uma extensão que a torne disponível.

Symfony2 é orientado a objeto, então você deve usar o objeto Session para definir os atributos da sessão e não confiar na matriz. O objeto Session abstrairá este material de você, então é mais fácil, por exemplo, armazenar a sessão em um banco de dados, porque armazenar a variável de sessão está oculta de você.

Portanto, defina seu atributo na sessão e recupere o valor em seu modelo de galho usando o 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 isto ajude.

Saudações,
Matt

128
Matt

Um truque simples é definir a matriz $ _SESSION como uma variável global. Para isso, edite o arquivo core.php na pasta de extensão adicionando esta função:

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

Então, você poderá acessar qualquer variável de sessão como:

{{ session.username }}

se você quiser acessar

$_SESSION['username']
20
Henry

Configurar galho

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

Em seguida, dentro de seus valores de sessão de acesso ao modelo, por exemplo

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

A maneira de acessar uma variável de sessão no Twig é:

{{ app.session.get('name_variable') }}
11
joan16v

Descobri que a maneira mais limpa de fazer isso é criar um TwigExtension personalizado e substituir seu método getGlobals(). Em vez de usar $_SESSION, também é melhor usar a classe Session do Symfony, já que ela lida automaticamente com a inicialização/parada da sessão.

Eu tenho a seguinte extensão em /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';
    }
}

Em seguida, adicione isso em /app/config/services.yml :

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

Em seguida, a sessão pode ser acessada de qualquer exibição usando:

{{ session.my_variable }}
5
this.lau_

Por que você não usa o {{app.object name.field name}} para acessar a variável?

0
Somnath De