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

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


person haynar    schedule 06.12.2011    source источник
comment
НЕ используйте $_SESSION в Symfony!   -  person Gigala    schedule 19.04.2013


Ответы (5)


{{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'] %}

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

С уважением,
Мэтт

person Matt    schedule 06.12.2011
comment
спасибо :) это помогло мне P.S. вам нужно изменить свой ответ следующим образом: $session->set('filter', array( 'accounts' => 'value' )); - person haynar; 06.12.2011
comment
Что, если сеансы хранятся в Memcached? - person Aysennoussi; 25.05.2014
comment
@Sekai не имеет значения, я бы сказал, если вы правильно его настроили - person Gigala; 28.07.2015

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

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

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

$_SESSION['username'] in php file Will be equivalent to {{ session.username }} in your twig template
person user1279047    schedule 17.02.2016
comment
Это отличный ответ. - person Vahid Amiri; 30.08.2016
comment
Да, отличный ответ. - person JimB814; 10.09.2016
comment
Да, отличный ответ - person migli; 01.03.2018
comment
Отличный ответ, потому что он работает без Symphony. Не показано, как это сделать в контейнере представления, который очень похож. Где $view — это вновь созданный объект Twig, добавьте следующее в функцию контейнера (там же, где вы можете добавить расширения). $view->getEnvironment()->addGlobal('session', $_SESSION); - person alttag; 17.03.2019
comment
Этот код не работает в последней версии Twig. @user1279047 - person franc; 21.01.2020
comment
Это решение по-прежнему работает с Twig 3.x — класс Twig_Environment был изменен только на Environment. - person Prawny; 08.06.2021

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

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

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

{{ session.username }}

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

$_SESSION['username']
person Henry    schedule 11.12.2011
comment
Это гораздо лучший ответ, чем приведенный выше, учитывая, что вы можете использовать Twig без использования Symfony. - person gazarsgo; 08.01.2013
comment
Вместо того, чтобы редактировать core.php, следуйте документации здесь: twig.sensiolabs.org/doc/advanced. html - person gazarsgo; 08.01.2013
comment
@gazarsgo Оба решения просто великолепны. - person pregmatch; 29.11.2013

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

{{ app.session.get('name_variable') }}
person joan16v    schedule 01.12.2016

Я обнаружил, что самый простой способ сделать это — создать собственный 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 }}
person laurent    schedule 27.08.2015
comment
Это приятно. Как я могу установить переменную сеанса в ветке, используя это решение? - person Ranhot; 24.01.2018
comment
@Ranhot, вы не должны устанавливать переменные сеанса в представлениях веток. Это должно быть сделано в контроллерах или службах. - person laurent; 24.01.2018