从TWIG模板访问会话

hay*_*nar 54 php session symfony twig

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

Mat*_*att 134

{{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'] %}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

问候,
马特


小智 25

安装树枝

$twig = new Twig_Environment(...);    
$twig->addGlobal('session', $_SESSION);
Run Code Online (Sandbox Code Playgroud)

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

$_SESSION['username'] in php file Will be equivalent to {{ session.username }} in your twig template
Run Code Online (Sandbox Code Playgroud)


小智 20

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

public function getGlobals() {
    return array(
        'session'   => $_SESSION,
    ) ;
}
Run Code Online (Sandbox Code Playgroud)

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

{{ session.username }}
Run Code Online (Sandbox Code Playgroud)

如果你想访问

$_SESSION['username']
Run Code Online (Sandbox Code Playgroud)

  • 考虑到您可以在不使用Symfony的情况下使用Twig,这是一个比上述更好的答案. (8认同)
  • 而不是编辑core.php虽然遵循这里的文档:http://twig.sensiolabs.org/doc/advanced.html (6认同)
  • @gazarsgo两种解决方案都很棒. (2认同)

joa*_*16v 12

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

{{ app.session.get('name_variable') }}
Run Code Online (Sandbox Code Playgroud)


lau*_*ent 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';
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在/app/config/services.yml中添加:

services:
    app.twig_extension:
        class: AppBundle\Twig\AppExtension
        public: false
        tags:
            - { name: twig.extension }
Run Code Online (Sandbox Code Playgroud)

然后可以使用以下任意视图访问会话:

{{ session.my_variable }}
Run Code Online (Sandbox Code Playgroud)

  • @Ranhot,您不应该在树枝视图中设置会话变量。这应该在控制器或服务中完成。 (2认同)