最近Twigを使うようになったので今後のための備忘録として書きます。
インスタンス生成
require_once '/path/to/vendor/autoload.php';
$loader = new Twig_Loader_Filesystem('/path/to/templates');
$loader->addPath('/path/to/additional_templates');
$twig = new Twig_Environment($loader, [
'cache' => '/path/to/cache_dir',
'auto_reload' => TRUE,
'strict_variables' => TRUE,
]);
テンプレートの読込
共有テンプレートなどはaddPath
などで一気に読み込むと良い。
キャッシュ
cache
に書いたパスにコンパイルしたPHPキャッシュファイルを置く。auto_reload
オプションはPHPファイルに変更があったらキャッシュファイルを置き換えてくれるので開発環境ではTRUE
、本番環境ではFALSE
にする。また、キャッシュがある限りそれを読み続けるので、本番環境にデプロイするときは一度全てキャッシュを消した方が良い。
変数名やメソッド名の厳密性
strict_variables
はデフォルトでFALSE
だが、もしここで存在しない変数名やメソッド名を呼ぶとエラーが出ずにスルーされる。それはとても困るのでTRUE
にする。
文法
デバッグ
var_dump的に
{{ dump(var) }}
print_r的に
{{- var|json_encode(constant('JSON_PRETTY_PRINT') b-or constant('JSON_UNESCAPED_UNICODE')) -}}
テンプレート内に読み込まれた全変数のキー
{% for k, v in _context %}
{{ k }}
{% endfor %}
include
{{ include('hoge.twig'[, with_context = false]) }}
include先に変数がそのまま引き渡される。引き渡したくなかったらwith_context = false
。
block
{% block BlockName %}{{ var }}{% endblock %}
{% block BlockName var %}
これらは等価。
比較
厳密な比較===
は使えない。同じことはsame as()
構文で実現できる。
{{ 0 is same as("0") ? "0 === '0'" : "0 !== '0'" }} // 0 !== '0'
ゆるい比較==
は可能。ただしPHP本家よりもゆるいので留意する。
{{ "aa" == null ? "'aa' == null" : "'aa' != null" }}
{# 'aa' != null #}
{{ 0 == null ? "0 == null" : "0 != null" }}
{# 0 == null #}
{{ "" == null ? "'' == null" : "'' != null" }}
{# '' == null #}
{{ [] == null ? "[] == null" : "[] != null" }}
{# [] == null #}
{{ hoge == null ? "undefined == null" : "undefined != null" }}
{# undefined == null #}
1-4はわかる。5つめが怖い。
foreach
{% for k, v in array %}
{{ k }}:{{ v }}
{% endfor %}
三項演算子
{{ foo ? 'yes' : 'no' }}
{# これらは等価 #}
{{ foo ?: 'no' }}
{{ foo ? foo : 'no' }}
{# これらは等価 #}
{{ foo ? 'yes' }}
{{ foo ? 'yes' : '' }}