強まっていこう

あっちゃこっちゃへ強まっていくためのブログです。

Twig の使い方 - シンプルなチートシート的メモ 1 - 基本

今更ながら使ってみて出来が非常に良いと思ったし速度もいい塩梅なの本気で使うことに。そのためのカンペ的なアレその1。Twig の syntax highlight がはてなブログに無いので見づらいのは我慢。highlight.js では対応してんのになぁ。

基本

最初に

composer require "twig/twig:^2.0"

ベンチ

github.com

自分の環境での結果。

smarty 3.96s
twig 1.82s
twig_reuse 1.10s

vim

cd .vim/bundle/
git clone https://github.com/evidens/vim-twig.git

ベースコード

<?

require_once __DIR__ . '/vendor/autoload.php';

$twig = new Twig_Environment(
  new Twig_Loader_Filesystem(__DIR__.'/tmpl'), [
    'cache'       => __DIR__ . '/tmpl_c',
    'auto_reload' => true,
    'debug'       => true,
  ]
);
$twig->addExtension(new Twig_Extension_Debug());
$stash = [
  'data'  => 'DATA'
];
echo $twig->render('index.twig', $stash);

本番では auto_reload, debug は false。debug と Twig_Extension_Debug は テンプレート内で dump を使わないなら必要なし。

コメント

{# コメント 複数行可 #}

変数

テンプレート内で定義

値は HTML エスケープされる。そのまま出したい場合はフィルター raw を通す。

{% set val = '<p>VAL</p>' %}

{# &lt;p&gt;VAL&lt;/p&gt; #}
{{ val }}

{# <p>VAL</p> #}
{{ val|raw }}

配列

{% set list = [ 'hoge', '<p>fuga</p>' ] %}
{# hoge #}
{{ list.0 }}
{# hoge #}
{{ list[0] }}
{#
  hoge
  &lt;p&gt;fuga&lt;/p&gt;
#}
{% for d in list %}
  {{ d }}
{% endfor %}

連想配列

{% set map = { hoge: 'HOGE', '<p>fuga</p>': '<p>FUGA</p>' } %}
{# hoge #}
{{ map.hoge }}
{% set key = 'hoge' %}
{# hoge #}
{{ map[key] }}
{% set map = map | merge({ fuga: 'FUGA' }) %}
{#
  hoge => HOGE
  &lt;p&gt;fuga&lt;/p&gt; => &lt;p&gt;FUGA&lt;/p&gt;
  fuga => FUGA
#}
{% for k, v in map %}
  {{ k }} => {{ v }}
{% endfor %}
パラメーターとして渡す
<?

echo $twig->render('anything.twig', [
  'val'     => '<p>VAL</p>',
  'map'     => [ 'hoge' => 'HOGE', '<p>fuga</p>' => '<p>FUGA</p>' ],
  'list'    => [ 'hoge', '<p>fuga</p>' ]
]);
{# &lt;p&gt;VAL&lt;/p&gt; #}
{{ val }}

{# <p>VAL</p> #}
{{ val|raw }}

{# 
  hoge
  &lt;p&gt;fuga&lt;/p&gt;
#}
{% for d in list %}
  {{ d }}
{% endfor %}

{# 
  hoge => HOGE
  &lt;p&gt;fuga&lt;/p&gt; => &lt;p&gt;FUGA&lt;/p&gt;
#}
{% for k, v in map %}
  {{ k }} => {{ v }}
{% endfor %}
直接
{# <p>直接書いたものはエスケープされない</p> #}
{{ '<p>直接書いたものはエスケープされない</p>' }}

{# &lt;p&gt;エスケープしたいならフィルター e&lt;/p&gt; #}
{{ '<p>エスケープしたいならフィルター e</p>'|e }}

{# &lt;p&gt;冗長に書いて人生を無駄にしたい場合&lt;/p&gt; #}
{{ '<p>冗長に書いて人生を無駄にしたい場合</p>'|escape('html') }}

制御

if

{% if xxx and yyy %}
  ......
{% elseif not zzz %}
  ......
{% else %}
  ......
{% endif %}

for

配列回し

{# 0123 #}
{% for i in [ 0, 1, 2, 3 ] %}{{ i }}{% endfor %}

{# 0123 #}
{% for i in 0..3 %}{{ i }}{% endfor %}

{# abcd #}
{% for c in 'a'..'d' %}{{ c }}{% endfor %}

{# ABCD #}
{% for c in 'A'..'D' %}{{ c }}{% endfor %}

連想配列回し

{# 
  hoge => HOGE
  fuga => FUGA
#}
{% for k, v in { hoge: 'HOGE', fuga: 'FUGA' } %}
  {{ k }} => {{ v }}
{% endfor %}

連想配列キーのみ

{# hogefuga #}
{% for k in { hoge: 'HOGE', fuga: 'FUGA' }|keys %}{{ k }}{% endfor %}

連想配列の値で出し分けを行う

{% set users = [
  {
    name: 'USER 1',
    active: 1,
  },
  {
    name: 'USER 2',
    active: 0,
  },
  {
    name: 'USER 3',
    active: 1,
  },
] %}
{#
  USER 1
  USER 3
#}
{% for user in users if user.active %}
  {{ user.name }}
{% endfor %}

配列の有無で表示を分ける

{% set users = [] %}
{# users is empty #}
{% for user in users if user.active %}
  {{ user.name }}
{% else %}
  users is empty
{% endfor %}

ループのパラメーター

{#
  aaa
  カウント: 1
  インデックス: 0
  カウント(): 2
  インデックス(): 1
  ループの最初で真: 1
  ループの最後で真:
  配列長: 2
  bbb
  カウント: 2
  インデックス: 1
  カウント(): 1
  インデックス(): 0
  ループの最初で真:
  ループの最後で真: 1
  配列長: 2
#}
{% for row in [ 'aaa', 'bbb' ] %}
  {{ row }}
  カウント: {{loop.index}}
  インデックス: {{loop.index0}}
  カウント(): {{loop.revindex}}
  インデックス(): {{loop.revindex0}}
  ループの最初で真: {{loop.first}}
  ループの最後で真: {{loop.last}}
  配列長: {{loop.length}}
{% endfor %}

変数スコープを絞る

{% set num = 100 %}
{% with %}
  {# 100 #}
  {{ num }}
  {% set num = 200 %}
  {# 200 #}
  {{ num }}
{% endwith %}
{# 100 #}
{{ num }}

{% with { hoge: 'HOGE' } only %}
  {# #}
  {{ num }}
  {# HOGE #}
  {{ hoge }}
{% endwith %}
{# #}
{{ hoge }}

改行とホワイトスペースを全て消す

{# <div><p>hoge</p><p>fuga</p></div> #}
{% spaceless %}
  <div>
    <p>hoge</p>
    <p>fuga</p>
  </div>
{% endspaceless %}

Twig の構文からなにからそのまま出す

{# 
  <ul>
  {% for d in list %}
    <li>{{ d }}</li>
  {% endfor %}
  </ul>
#}
{% verbatim %}
  <ul>
  {% for d in list %}
    <li>{{ d }}</li>
  {% endfor %}
  </ul>
{% endverbatim %}