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

43

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

  • 10
    НЕ используйте $ _SESSION в Symfony!
Теги:
session
twig

6 ответов

114
Лучший ответ

{{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

  • 1
    спасибо :) это помогло мне PS вам нужно изменить свой ответ следующим образом: $session->set('filter', array( 'accounts' => 'value' ));
  • 0
    Что если сессии хранятся в Memcached?
Показать ещё 1 комментарий
20

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

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

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

{{ session.username }}

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

$_SESSION['username']
  • 8
    Это гораздо лучший ответ, чем приведенный выше, учитывая, что вы можете использовать Twig без Symfony.
  • 6
    Вместо того, чтобы редактировать core.php, следуйте документации здесь: twig.sensiolabs.org/doc/advanced.html
Показать ещё 1 комментарий
10

Настройка веточки

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

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

$_SESSION['username'] in php file Will be equivalent to {{ session.username }} in your twig template
  • 0
    Это отличный ответ.
  • 0
    Да, отличный ответ.
Показать ещё 3 комментария
6

Способ доступа к переменной сеанса в 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 }}
  • 0
    Спасибо за это отличное решение
  • 0
    Это мило. Как я могу установить переменную сеанса в веточку, используя это решение ??
Показать ещё 1 комментарий
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню