Я много искал в сети, как получить доступ к глобальному массиву $_SESSION
из шаблона TWIG и нашел это: {{app.session.get('index')}}
, но когда я его вызываю, он возвращает пустую строку. У меня есть $_SESSION['filter']['accounts']
, и я получаю эту ошибку при вызове {{app.session.get('filter').accounts}}
: Item "accounts" for "" does not exist
. Что я делаю неправильно?
Доступ к сеансу из шаблона TWIG
Ответ 1
{{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
Ответ 2
Простым трюком является определение массива $_SESSION как глобальной переменной. Для этого отредактируйте файл core.php в папке расширения, добавив эту функцию:
public function getGlobals() {
return array(
'session' => $_SESSION,
) ;
}
Затем вы сможете использовать любую переменную сеанса как:
{{ session.username }}
если вы хотите получить доступ к
$_SESSION['username']
Ответ 3
Настройка веточки
$twig = new Twig_Environment(...);
$twig->addGlobal('session', $_SESSION);
Затем в пределах ваших значений доступа к шаблону, например
$_SESSION['username'] in php file Will be equivalent to {{ session.username }} in your twig template
Ответ 4
Способ доступа к переменной сеанса в Twig:
{{ app.session.get('name_variable') }}
Ответ 5
Я обнаружил, что самый чистый способ сделать это - создать пользовательское TwigExtension и переопределить его метод getGlobals()
. Вместо использования $_SESSION
также лучше использовать класс Symfony Session
, поскольку он автоматически запускает/останавливает сеанс.
У меня есть следующее расширение в /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 }}
Ответ 6
Почему вы не используете {{app.object name.field name}} для доступа к переменной?