【问题标题】:Accessing session from TWIG template从 TWIG 模板访问会话
【发布时间】:2016-12-01 17:12:06
【问题描述】:

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

【问题讨论】:

  • 不要在 Symfony 中使用 $_SESSION!

标签: php session symfony twig


【解决方案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'] %}

希望这会有所帮助。

问候,
马特

【讨论】:

  • 谢谢 :) 这对我有帮助您需要将答案更改为:$session->set('filter', array( 'accounts' => 'value' ));
  • 如果会话存储在 Memcached 中会怎样?
  • @Sekai 如果你配置正确,我会说没有什么不同
【解决方案2】:

设置树枝

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

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

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

【讨论】:

  • 这是一个很好的答案。
  • 是的,很好的答案。
  • 是的,很好的答案
  • 很好的答案,因为它可以在没有 Symphony 的情况下工作。未显示如何在视图容器中执行此操作,这非常相似。其中$view 是新创建的 Twig 对象,将以下内容添加到容器函数(您可能会添加扩展的相同位置)。 $view->getEnvironment()->addGlobal('session', $_SESSION);
  • 此代码在最新的 Twig 版本中不起作用。 @user1279047
【解决方案3】:

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

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

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

{{ session.username }}

如果你想访问

$_SESSION['username']

【讨论】:

  • 这是一个比上面更好的答案,因为您可以在不使用 Symfony 的情况下使用 Twig。
  • 而不是编辑 core.php,尽管按照这里的文档:twig.sensiolabs.org/doc/advanced.html
  • @gazarsgo 两种解决方案都很棒。
【解决方案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 }}
    

    【讨论】:

    • 这很好。如何使用此解决方案在 twig 中设置会话变量??
    • @Ranhot,您不应该在树枝视图中设置会话变量。这应该在控制器或服务中完成。
    猜你喜欢
    • 2014-06-10
    • 2012-06-02
    • 2011-02-02
    • 2013-04-23
    • 2011-09-13
    • 2012-08-26
    • 2023-03-18
    • 2015-11-10
    相关资源
    最近更新 更多