Accès à la session à partir du 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 quand je l'appelle, il renvoie une chaîne vide. J'ai un $_SESSION['filter']['accounts'] et j'obtiens cette erreur lors de l'appel {{app.session.get('filter').accounts}}: Item "accounts" for "" does not exist. Ce que je fais mal?

49
demandé sur haynar 2011-12-06 15:46:34

6 réponses

{{app.session}} fait référence à l'objet Session et non au tableau $_SESSION. Je ne pense pas que le tableau $_SESSION soit accessible sauf si vous le transmettez explicitement à chaque modèle de brindille ou si vous faites une extension qui le rend disponible.

Symfony2 est orienté objet, vous devez donc utiliser l'objet Session pour définir les attributs de session et ne pas compter sur le tableau. L'objet Session abstrait ce genre de choses loin de vous, il est donc plus facile, disons, de stocker la session dans une base de données car le stockage de la variable de session est cachés de vous.

Définissez donc votre attribut dans la session et récupérez la valeur dans votre modèle twig 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 aide.

Cordialement,
Matt

124
répondu Matt 2015-08-21 13:57:42

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

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

Ensuite, vous pourrez accéder à n'importe quelle variable de session comme:

{{ session.username }}

Si vous souhaitez accéder à

$_SESSION['username']
20
répondu Henry 2011-12-11 18:09:22

Configuration brindille

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

Ensuite, dans votre modèle, accédez aux valeurs de session, par exemple

$_SESSION['username'] in php file Will be equivalent to {{ session.username }} in your twig template
16
répondu user1279047 2016-02-17 19:20:06

La façon d'accéder à une variable de session dans Twig est:

{{ app.session.get('name_variable') }}
10
répondu joan16v 2016-12-01 09:12:06

J'ai trouvé que la façon la plus propre de le faire est de créer une extension twigextension personnalisée 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 automatiquement le démarrage/arrêt 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';
    }
}

Puis ajoutez ceci dans /app/config/services.yml :

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

Ensuite, la session est accessible depuis n'importe quelle vue utilisation:

{{ session.my_variable }}
5
répondu this.lau_ 2015-08-27 14:48:06

Pourquoi ne pas utiliser {{ app.nom de l'objet.nom du champ}} pour accéder à la variable?

0
répondu Somnath De 2014-08-03 09:19:57