Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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}} для доступа к переменной?