PHPTemplateとTwig themingの記法の比較

PHPTemplateとTwig themingの記法の比較
この記事は「 Comparison of PHPTemplate and Twig theming paradigms 」の翻訳です。
この記事の目次

最終更新日 2018年1月20日

Twigについて

TwigはPHPへのコンパイルテンプレート言語です。Webページがレンダリングされるとき、Twigエンジンはテンプレートを、PHPTemplateにコンパイルします。コンパイルされたテンプレートは、保護ディレクトリ(sites/default/files/php/twig)に保存されます。1度コンパイルされたテンプレートファイルは、キャッシュ後再利用されます。Twigのキャッシュをクリアすると再コンパイルされます。

Drupal Twig の イニシアチブは、Symfonyイニシアチブと同じ目的を持っており、開発者がDrupalに適切に集中できるように、モダンで強力なOOPベースのエンジンを採用しています

1. Docblock

PHPTemplate:

<?php 
/** 
 * @file
 * File description
 */
?>

Twig:

{# 
/** 
 * @file
 * File description
 */
#}

2.ファイル名と関数名

PHPTemplateファイル:

node--article.tpl.php

Twigファイル:

node--article.html.twig

PHPTemplate関数:

THEME_node_links()

Twigファイル:

node-links.html.twig

3.変数

変数を出力:

PHPTemplate:

<div class="content"><?php print $content; ?></div>

 

Twig:

<div class="content">{{ content }}</div>

 

ハッシュキー項目の出力[1]

PHPTemplate:

<?php print $item['#item']['alt']; ?>

Twig:

{{ item['#item'].alt }} 

変数の割り当て

PHPTemplate:

<?php $custom_var = $content->comments; ?>

Twig:

{% set custom_var = content.comments %}

配列の割り当て:

PHPTemplate:

<?php $args = array('@author' => $author, '@date' => $created); ?>

Twig:

{% set args = {'@author': author, '@date': created} %}

4.条件式

PHPTemplate:

<?php if ($content->comments): endif; ?>

Twig:

{% if content.comments %} {% endif %}

PHPTemplate:

<?php if (!empty($content->comments)): endif; ?>

Twig:

{% if content.comments is not empty %} {% endif %}

PHPTemplate:

<?php if (isset($content->comments)): endif; ?>

Twig:

{% if content.comments is defined %} {% endif %}

PHPTemplate:

<?php if ($count > 0): endif; ?>

Twig:

{% if count > 0 %} {% endif %}

5.ループ処理

PHPTemplate:

<?php foreach ($users as $user) {} ?>

Twig:

{% for user in users %} {% endfor %}

6.フィルタ処理

HTML特殊文字のエスケープ処理:

PHPTemplate:

<?php print check_plain($title); ?>

Twig[2]

{{ title }}

未加工の値:

PHPTemplate:

<?php print $title; ?>

Twig:

{{ title|raw }}

多言語対応:

PHPTemplate:

<?php print t('Home'); ?>

Twig:

{{ 'Home'|t }}

置き換えを伴う多言語対応:

PHPTemplate:

<?php print t('Welcome, @username', array('@username' => $user->name)); ?>

Twig:

{{ 'Welcome, @username'|t({ '@username': user.name }) }}

Drupal 8 Twig(trans タグによる拡張):

{% set username = user.name %}
{% trans %}
  Welcome, {{ username }}
{% endtrans %}

リストを埋め込む:

PHPTemplate:

<?php echo implode(', ', $usernames); ?>

Twig:

{{ usernames | join(', ') }}

マークアップにリストを埋め込む:

Twig:

{{ usernames | safe_join(', ') }}

PHPTemplateの場合、文字列の配列・$usernamesが必要です。オリジナルのTwigの場合、「usernames」が文字列の配列となります。一方、Drupal 8 Twigの場合、レンダリング可能なオブジェクトの配列が必要になります。これは、Drupal 8 Twigと通常のTwigの明らかな違いです。Drupal 8 Twigはプレーンテキストとレンダリング可能な配列の両方を書き出します。

上記3つのパターンは、すべて同じ出力結果になるように思えますが、デフォルトではそうではありません。 以下のDrupal 8 Twigの例を考えてみましょう:

  {% set numbers = [{'#markup': 'One'}, {'#markup':'Two'}, {'#markup':'Three'}] %}
  {{ numbers }}

上記の出力結果は「OneTwoThree」になります。

{% set numbers = [{'#markup': 'One'}, {'#markup':'Two'}, {'#markup':'Three'}] %}
{{ numbers | safe_join(', ') }}

上記の出力結果は「One, Two, Three」になります。

7.スペースの制御

Twigでは、テンプレートファイルの構造化のために書かれたスペースを取り除くことができます。

<div class="body">
  {{- block.content -}}
</div>

上記と同じ結果になります:

<div class="body">{{ block.content }}</div>

ノート

  1. ハッシュキー項目の例は将来変更される可能性があります ↩︎︎
  2. この例では、Twigが、データをサニタイズすることが書かれています。以前は、この処理には、テンプレートファイル、または前処理関数が必要でした。
    重要:この変更から、Drupal 8テーマをPHPTemplateで作成する場合には、データをHTMLエスケープ処理する必要があります。↩︎︎

詳細は、以下を参照してください。

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

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

関連コンテンツ