TWIGテンプレートからグローバル_$_SESSION
_配列にアクセスする方法をネット上で多く検索し、これを見つけました:{{app.session.get('index')}}
、しかしそれを呼び出すとき、それは空の文字列を返します_$_SESSION['filter']['accounts']
_があり、{{app.session.get('filter').accounts}}
:_Item "accounts" for "" does not exist
_を呼び出すとこのエラーが発生します。
{{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'] %}
お役に立てれば。
よろしく、
マット
設定小枝
$twig = new Twig_Environment(...);
$twig->addGlobal('session', $_SESSION);
次に、テンプレートアクセスセッション内の値の例
$_SESSION['username'] in php file Will be equivalent to {{ session.username }} in your twig template
簡単なトリックは、$ _ SESSION配列をグローバル変数として定義することです。そのためには、次の関数を追加して、拡張フォルダーのcore.phpファイルを編集します。
public function getGlobals() {
return array(
'session' => $_SESSION,
) ;
}
次に、セッション変数を次のようにアクセスできます。
{{ session.username }}
アクセスしたい場合
$_SESSION['username']
Twigでセッション変数にアクセスする方法は次のとおりです。
{{ app.session.get('name_variable') }}
これを行う最もクリーンな方法は、カスタム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 }}
{{app.object name.field name}}を使用して変数にアクセスしないのはなぜですか?