Twigテンプレートの変数のデバッグ

Twigテンプレートの変数のデバッグ
この記事は「 Discovering and Inspecting Variables in Twig Templates 」の翻訳です。
この記事の目次

最終更新日 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モジュールがあります。

  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'のように、テンプレート内で使用したいメソッドを指定します。

この記事を書いた人 : Kentaro Inoue

ANNAI株式会社
マーケティングマネージャー
サービスの設計・企画、マーケティング、採用戦略の立案などを担当。普段は新潟で猫と一緒に、時々海外からリモートで働いています。好きなモジュールはRulesとFlagです。

関連コンテンツ