web-dev-qa-db-ja.com

TWIGテンプレートからセッションにアクセスする

TWIGテンプレートからグローバル_$_SESSION_配列にアクセスする方法をネット上で多く検索し、これを見つけました:{{app.session.get('index')}}、しかしそれを呼び出すとき、それは空の文字列を返します_$_SESSION['filter']['accounts']_があり、{{app.session.get('filter').accounts}}:_Item "accounts" for "" does not exist_を呼び出すとこのエラーが発生します。

54
haynar

{{app.session}}は、$_SESSION配列ではなく、Sessionオブジェクトを参照します。 $_SESSION配列は、すべてのTwigテンプレートに明示的に渡すか、拡張機能を使用可能にする場合を除き、アクセスできないと思います。

Symfony2はオブジェクト指向であるため、Sessionオブジェクトを使用してセッション属性を設定し、配列に依存しないでください。 Sessionオブジェクトはこのようなものを抽象化するので、セッション変数を保存することはあなたには見えないので、たとえばデータベースにセッションを保存する方が簡単です。

そのため、セッションで属性を設定し、Sessionオブジェクトを使用してtwigテンプレートで値を取得します。

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

お役に立てれば。

よろしく、
マット

132
Matt

設定小枝

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

次に、テンプレートアクセスセッション内の値の例

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

簡単なトリックは、$ _ SESSION配列をグローバル変数として定義することです。そのためには、次の関数を追加して、拡張フォルダーのcore.phpファイルを編集します。

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

次に、セッション変数を次のようにアクセスできます。

{{ session.username }}

アクセスしたい場合

$_SESSION['username']
20
Henry

Twigでセッション変数にアクセスする方法は次のとおりです。

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

これを行う最もクリーンな方法は、カスタム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
laurent

{{app.object name.field name}}を使用して変数にアクセスしないのはなぜですか?

0
Somnath De