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