Twigテンプレートでの変数の検出と検査
Twigテンプレートファイルを扱う場合、ほとんどの変数はテンプレートファイルのコメントに記載されています。しかし、そうでない場合、またはテーマやモジュールが新しい変数を導入する場合は、テンプレート内で利用可能なすべての変数を検出する方法が必要です。Twigはテンプレートファイル内の変数を検出および検査するためのdump()関数を提供します。
デバッグが有効になっていないと、dump()関数は出力を表示しません。Twigデバッグを有効にする方法を学ぶ。
有効にすると、dump()関数を使用して、テンプレート内の1つ以上の変数に関する情報を出力できます。
単一の変数の検査
テンプレートにtitle変数がある場合、次はその内容をテンプレートに出力します:
{{ dump(title) }}
テンプレートで利用可能なすべての変数の検出
利用可能なすべての変数とその内容をテンプレートに出力するには、次をテンプレートに追加します(デバッグを有効にした後):
{{ dump() }}
利用可能な変数キーのみを出力するには、次を使用します:
{{ dump(_context|keys) }}
すべてのTwigテンプレートで追加のグローバル変数が利用できます:
- _selfは現在のテンプレートを参照し、コンパイルされたテンプレートのクラス名やTwig環境情報など、テンプレートに関する拡張情報を保持します。_selfは廃止され、Twig 2.xで削除されました。
- _contextは現在のコンテキストを参照し、theme()から送信された変数、前処理で準備された変数、テンプレート内で設定された変数など、テンプレートに渡されたすべての変数を保持します。変数を指定せずに{{dump()}}を追加することは{{dump(_context)}}と同等です。
- _charsetは現在の文字セットを参照します。
dump()に注意
すべての変数を確認したいが、dump()が再帰などによりメモリを使い果たしてしまう場合は、_contextを表示してその中のすべてのキーを確認できます:
<ol>
{% for key, value in _context %}
<li>{{ key }}</li>
{% endfor %}
</ol>
次に、条件チェック(例:{% if loop.index == 2 %})を使用し、必要な場合にのみその値を出力します。
詳細情報
dump関数の詳細については、Twig dump関数のドキュメントを参照してください。
xdebugを使用したデバッグ
最も推奨されるデバッグ方法は、xdebugプラグインを使用したIDEを使用することです。
設定が最も簡単なのは、PHPstorm(商用)とxdebugを使用することです。Microsoft VSCodeはオープンソースの無料IDEで、同じことを行うプラグインがありますが、商用ソフトウェアを購入する必要はありません。
xdebugを使用すると、プロセスをステップ実行し、変数の内容を確認でき、dumpやkintを使用したときに発生する可能性のある無限ループを防ぐとともに、内部の謎を解明できます。
twig_xdebugという小さな便利なモジュールは、xdebugで利用可能な変数の表示に役立ちます。
kintを使用したデバッグ
Twigのdump()関数は、Webページに多くのテキストを出力することが多く、干し草の山の中から針を見つけるのが難しくなります。
dump()の代替として、PHPデバッグツールのkintがあります。kint()関数は上記のdump()関数とまったく同じように動作しますが、出力する変数に対して拡張可能/折りたたみ可能なインターフェースを提供します。
develプロジェクトは、開発者がdump()の代わりにkint()を使用できるようにするdevel kintモジュールを提供します。
1. develモジュールをダウンロードします。
2. 「devel kint」モジュールをインストールします。
3. dump関数と同様に、デバッグが有効になっていないとkint()は出力を表示しません。Twigデバッグを有効にする方法を学ぶ。
4. .twigファイルで、dump()で説明したようにkint()を使用して変数を検査します。
5. 必要に応じて、ネストされた変数のリストを検索するためにSearch Kintモジュールをダウンロードしてインストールします。
メソッドとクラスのホワイトリストポリシー
オブジェクトを扱うときは、TwigSandboxPolicyクラスを通じて、特定のセットのgetter/setterメソッドまたはオブジェクトの呼び出しをホワイトリストに登録します。これは、テンプレートで誤ってメソッドが呼び出されるのを防ぐためです。たとえば、ノードオブジェクトの{{node.delete}}は、ホワイトリストがなければノードを削除する可能性があります。このホワイトリストを拡張するには、settings.phpファイルに次を追加します:
$settings['twig_sandbox_whitelisted_methods'] = [
'id',
'label',
'bundle',
'get',
'__toString',
'toString',
'referencedEntities',
];
ここで'referencedEntities'は、テンプレートで使用したいメソッドです。