最終更新日 2017年11月13日
dump()関数は、デバッグが有効になっていないと使用できません。(参考:Twigでデバッグを有効にする方法)
有効になると、dump()関数は、テンプレート内の1つまたは複数の変数の情報を出力します。
1つの変数を検出する
テンプレートで利用可能な変数「title」がある場合、次のコードで、その内容がテンプレートに出力されます。
{{ dump(title) }}
テンプレート内の利用可能な変数をすべて検出する
利用可能なすべての変数とその内容をテンプレートに出力するには、(デバッグを有効にした後で)テンプレートに次の行を追加します。
{{ dump() }}
Twigで利用可能な変数名のみを出力するには、以下を使用します。
{{ dump(_context|keys) }}
すべてのTwigテンプレートで利用可能なグローバル変数があります:
- _self 変数
現在のテンプレートに関する詳細な情報、コンパイルされたテンプレートクラス名とTwig環境に関する情報を参照します。「_self」変数は廃止され、Twigバージョン2.xから削除されました。
- _context 変数
現在のコンテキストや、theme()から送られた変数、前処理で準備された変数、テンプレート内で設定された変数など、テンプレートに渡されるすべての変数を参照します。{{ dump() }}のように変数を指定しない場合と、({{ dump(_context) }})のように_context 変数を指定した場合は、同じ結果が出力されます。
- _charset 変数
現在の文字セットを参照します。
dump()を使用する際の注意点
すべての変数を出力したいが、再帰などで、dump()がメモリを使い果たす場合は、_context変数をループさせることで、すべてのキー(変数名)を表示可能です。
<ol>
{% for key, value in _context %}
<li>{{ key }}</li>
{% endfor %}
</ol>
たとえば{% if loop.index == 2 %} のような条件を指定し、条件に合う場合のみその値を出力することも可能です。
詳しくは
詳細は、Twigのdump関数ドキュメントを参照してください。
xdebug を使ったデバッグ
デバッグ方法には、xdebugプラグインをIDE内で使用することをお勧めします。
PHPstorm(商用ソフトウエア)では、xdebugを簡単に導入できます。マイクロソフト製 VSCodeは、商用ソフトウェアではなく、同等の機能のプラグインがある無料のオープンソースIDEです。
xdebugを使用すると、プロセスを段階的に実行し、変数の内容を出力し、dump、kintの使用時に発生するかもしれない無限ループを防ぐと同時に、隠れたバグを解消することが可能です。
twig_xdebugモジュールは、xdebugを使い、利用可能な変数を出力します。
kint を使ったデバッグ
Twigのdump()機能は、ページ内にたくさんのテキストを出力することが多く、その中から使用したい変数を探すのが大変です。
PHPのデバッグツール kintは、dump()の代わりに使えます。kint()関数はdump()関数と同じように機能し、さらに、出力される変数を、折りたたんで展開可能な状態で出力します。
devel project には、シーマーがdump()の代わりにkint()が使用できるdevel KINTモジュールがあります。
- develモジュールをダウンロードします。
- "devel kint"モジュールをインストールします。
- dump関数と同様、kint()もデバッグが有効になっていないと変数を表示しません。(参考:Twigでデバッグを有効にする方法)
- Twigファイルでは、dump()と同様、kint()で変数を検出します。
- 必要に応じて、Search Kintモジュールをダウンロード・インストールして、ネストされた変数リストを検索します。
メソッドとクラスのホワイトリストポリシー
オブジェクトを扱う際には、TwigSandboxPolicyクラスから、getter、setter、オブジェクトの特定セットの呼び出しを、ホワイトリストに入れます。これは、誤ったメソッドがテンプレート内で呼び出されないようにするためです。例えば、ノードオブジェクトの{{ node.delete }}メソッドは、ホワイトリストが設定されてない場合、そのノードを削除する可能性があるためです。settings.phpへ以下のように追記することで、ホワイトリストを拡張することができます。
$settings['twig_sandbox_whitelisted_methods'] = [
'id',
'label',
'bundle',
'get',
'__toString',
'toString',
'referencedEntities',
];
'referencedEntities'のように、テンプレート内で使用したいメソッドを指定します。