Доступ к сеансу из шаблона TWIG

Я много искал в сети, как получить доступ к глобальному массиву $_SESSION из шаблона TWIG и нашел это: {{app.session.get('index')}} , но когда я его {{app.session.get('index')}} , он возвращает пустая строка. У меня есть $_SESSION['filter']['accounts'] и я получаю эту ошибку при вызове {{app.session.get('filter').accounts}} : Item "accounts" for "" does not exist . Что я делаю неправильно?

Solutions Collecting From Web of "Доступ к сеансу из шаблона TWIG"

{{app.session}} относится к объекту Session а не к массиву $_SESSION . Я не думаю, что массив $_SESSION доступен, если вы явно не передаете его каждому шаблону Twig или если вы используете расширение, которое делает его доступным.

Symfony2 объектно-ориентирован, поэтому вы должны использовать объект Session для установки атрибутов сеанса и не полагаться на массив. Объект Session будет абстрагировать этот материал от вас, поэтому проще, скажем, сохранить сеанс в базе данных, поскольку сохранение переменной сеанса скрыто от вас.

Таким образом, установите свой атрибут в сеансе и извлеките значение в шаблоне ветки, используя объект 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'] %} 

Надеюсь это поможет.

С Уважением,
Matt

Простой трюк состоит в том, чтобы определить массив $ _SESSION как глобальную переменную. Для этого отредактируйте файл core.php в папке расширения, добавив эту функцию:

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

Затем вы сможете использовать любую переменную сеанса как:

 {{ session.username }} 

если вы хотите получить доступ к

 $_SESSION['username'] 

Установочная веточка

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

Затем в пределах ваших значений доступа к шаблону, например

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

Способ доступа к переменной сеанса в Twig:

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

Я обнаружил, что самый чистый способ сделать это – создать пользовательский TwigExtension и переопределить его getGlobals() . Вместо использования $_SESSION также лучше использовать класс Session Symfony, поскольку он автоматически запускает / останавливает сеанс.

У меня есть следующее расширение в /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'; } } 

Затем добавьте это в /app/config/services.yml :

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

Затем сеанс можно получить из любого вида, используя:

 {{ session.my_variable }} 

Почему вы не используете {{app.object name.field name}} для доступа к переменной?