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


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

Author: haynar, 2011-12-06

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

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

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

 124
Author: Matt, 2015-08-21 13:57:42

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

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

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

{{ session.username }}

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

$_SESSION['username']
 20
Author: Henry, 2011-12-11 18:09:22

Ветка настройки

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

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

$_SESSION['username'] in php file Will be equivalent to {{ session.username }} in your twig template
 16
Author: user1279047, 2016-02-17 19:20:06

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

{{ app.session.get('name_variable') }}
 10
Author: joan16v, 2016-12-01 09:12:06

Я обнаружил, что самый чистый способ сделать это - создать пользовательское расширение ветки и переопределить его метод 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 }}
 5
Author: this.lau_, 2015-08-27 14:48:06

Почему бы вам не использовать {{имя приложения.объекта.имя поля}} для доступа к переменной?

 0
Author: Somnath De, 2014-08-03 09:19:57