从TWIG模板访问会话

时间:2011-12-06 11:46:34

标签: php session symfony twig

我在网上搜索了很多如何从TWIG模板访问全局$_SESSION数组并发现:{{app.session.get('index')}},但是当我调用它时,它返回一个空字符串。我有一个$_SESSION['filter']['accounts'],我在调用{{app.session.get('filter').accounts}}时遇到此错误:Item "accounts" for "" does not exist。我做错了什么?

6 个答案:

答案 0 :(得分:130)

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

希望这有帮助。

的问候,
马特

答案 1 :(得分:20)

一个简单的技巧是将$ _SESSION数组定义为全局变量。为此,通过添加以下函数编辑扩展文件夹中的core.php文件:

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

然后,您将能够访问任何会话变量:

{{ session.username }}

如果您想访问

$_SESSION['username']

答案 2 :(得分:20)

设置树枝

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

然后在您的模板中访问会话值,例如

$_SESSION['username'] in php file Will be equivalent to {{ session.username }} in your twig template

答案 3 :(得分:12)

在Twig中访问会话变量的方法是:

{{ app.session.get('name_variable') }}

答案 4 :(得分: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 }}

答案 5 :(得分:0)

为什么不使用{{app.object name.field name}}来访问变量?