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?
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
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']
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
La façon d'accéder à une variable de session dans Twig est:
{{ app.session.get('name_variable') }}
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 }}
Pourquoi ne pas utiliser {{ app.nom de l'objet.nom du champ}} pour accéder à la variable?