Php 从细枝模板访问会话

Php 从细枝模板访问会话,php,session,symfony,twig,Php,Session,Symfony,Twig,我在网上搜索了很多如何从TWIG模板访问全局$\u SESSION数组,发现:{{app.SESSION.get('index')}},但是当我调用它时,它返回一个空字符串。我有一个$\u会话['filter']['accounts'],调用{{{app.SESSION.get('filter').accounts}}:项“”的“accounts”不存在。我做错了什么?{{app.session}}指的是会话对象,而不是$\u会话数组。我不认为$\u会话数组是可访问的,除非您显式地将其传递给每个

我在网上搜索了很多如何从TWIG模板访问全局
$\u SESSION
数组,发现:
{{app.SESSION.get('index')}}
,但是当我调用它时,它返回一个空字符串。我有一个
$\u会话['filter']['accounts']
,调用
{{{app.SESSION.get('filter').accounts}}
项“”的“accounts”不存在。我做错了什么?

{{app.session}}
指的是
会话
对象,而不是
$\u会话
数组。我不认为
$\u会话
数组是可访问的,除非您显式地将其传递给每个细枝模板,或者如果您进行了扩展使其可用

Symfony2是面向对象的,因此您应该使用
会话
对象来设置会话属性,而不依赖于数组。
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

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

public function getGlobals() {
    return array(
        'session'   => $_SESSION,
    ) ;
}
然后,您将能够访问任何会话变量,如下所示:

{{ session.username }}
如果您想访问

$_SESSION['username']

我发现最干净的方法是创建一个自定义TwigExtension并重写它的
getGlobals()
方法。与其使用
$\u 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';
    }
}
然后,可以通过以下方式从任何视图访问会话:

{{ session.my_variable }}
设置小枝

$twig = new Twig_Environment(...);    
$twig->addGlobal('session', $_SESSION);
然后在模板中访问会话值,例如

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

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

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

谢谢:)这帮了我的忙。你需要更改你的答案如下:
$session->set('filter',array('accounts'=>'value')如果会话存储在Memcached中怎么办?@Sekai没有什么区别,如果您正确配置了它,我会说这是一个比上面更好的答案,因为您可以在不使用Symfony的情况下使用Twig。而不是编辑core.php,但请遵循以下文档:@gazarsgo这两个解决方案都很好。不要在Symfony中使用$\u会话!这是一个伟大的答案。是的,伟大的答案。是的,伟大的答案伟大的答案,因为它没有交响乐。未显示如何在视图容器中执行此操作,这与视图容器非常相似。如果
$view
是新创建的细枝对象,请将以下内容添加到容器函数中(与您可能添加扩展的位置相同)<代码>$view->getEnvironment()->addGlobal('session',$\u session)此代码在最新的Twig版本中不起作用@USER1279047这很好。如何使用此解决方案在twig中设置会话变量???@Ranhot,您不应该在twig视图中设置会话变量。这应该在控制器或服务中完成。