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