web-dev-qa-db-fra.com

Accéder à la session depuis le modèle TWIG

J'ai beaucoup cherché sur le net comment accéder au tableau global $_SESSION à partir du modèle TWIG et j'ai trouvé ceci: {{app.session.get('index')}}, mais lorsque je l'appelle, il renvoie une chaîne vide. J'ai un $_SESSION['filter']['accounts'] et j'obtiens cette erreur en appelant {{app.session.get('filter').accounts}}: Item "accounts" for "" does not exist. Qu'est-ce que je fais mal?

52
haynar

{{app.session}} fait référence à l'objet Session et non au tableau $_SESSION. Je ne pense pas que le tableau $_SESSION soit accessible à moins que vous ne le transmettiez explicitement à chaque modèle Twig ou que vous créiez une extension le rendant disponible.

Symfony2 étant orienté objet, vous devez donc utiliser l'objet Session pour définir les attributs de session et ne pas vous fier au tableau. L'objet Session fera abstraction de ces éléments afin qu'il soit plus facile, par exemple, de stocker la session dans une base de données, car le stockage de la variable de session est masqué.

Donc, définissez votre attribut dans la session et récupérez la valeur dans votre modèle de brindille en utilisant l’objet 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'] %}

J'espère que cela t'aides.

Cordialement,
Mat

128
Matt

Une astuce simple consiste à définir le tableau $ _SESSION en tant que variable globale. Pour cela, éditez le fichier core.php dans le dossier de l'extension en ajoutant cette fonction:

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

Ensuite, vous pourrez accéder à n’importe quelle variable de session en tant que:

{{ session.username }}

si vous voulez accéder à

$_SESSION['username']
20
Henry

Configuration brindille

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

Ensuite, dans vos valeurs de session d'accès aux modèles, par exemple

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

Le moyen d'accéder à une variable de session dans Twig est le suivant:

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

J'ai trouvé que le moyen le plus simple de le faire est de créer un TwigExtension personnalisé et de remplacer sa méthode getGlobals(). Plutôt que d'utiliser $_SESSION, il est également préférable d'utiliser la classe Session de Symfony car elle gère le démarrage/l'arrêt automatique de la session.

J'ai l'extension suivante dans /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';
    }
}

Ajoutez ensuite ceci dans /app/config/services.yml :

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

Vous pouvez ensuite accéder à la session à partir de n’importe quelle vue en utilisant:

{{ session.my_variable }}
5
this.lau_

Pourquoi n'utilisez-vous pas {{app.object name.field name}} pour accéder à la variable?

0
Somnath De