12.

PHP のテンプレートエンジン比較(Twig / Blade / Smarty / Plates / Mustache)

編集
この記事の要点
  • テンプレートエンジン = HTML の中に変数や制御構文を埋め込み、HTML エスケープを自動化するライブラリ
  • 主要 5 つ: Twig (Symfony 標準・モダン) / Blade (Laravel 専用) / Smarty (老舗) / Plates (素の PHP に近い) / Mustache (ロジックレス・多言語)
  • 共通機能: 変数展開・制御構文・テンプレート継承 (extends)・include / partial・フィルタ・自動エスケープ
  • パフォーマンス: 初回コンパイルして PHP に変換 → 以降は コンパイル済キャッシュ使用
  • 素の PHP を使う場合は を毎回書く必要 → 漏れると XSS の温床

なぜテンプレートエンジンを使うのか

素の PHP でも HTML を出力できますが、以下の問題があります:

  • HTML エスケープが手動 → 漏れると XSS
  • ロジックと表示が混在しやすく可読性が悪い
  • 共通レイアウトの継承が冗長(毎ファイルにヘッダー・フッターの include)
  • 非エンジニア(デザイナー)に PHP を触らせたくない

テンプレートエンジンはこれらを制約付き構文 + 自動エスケープで解決します。

5 大テンプレートエンジンの比較

エンジン用途特徴
TwigSymfony / フレームワーク非依存モダン・高速・継承・サンドボックス。Drupal でも採用
BladeLaravel 専用@directive 構文・コンポーネント・スロット
Smarty老舗 (2001-)歴史長くドキュメント豊富。記法はやや古い
Plates素の PHP に近い独自構文学習不要・軽量・継承サポート
Mustacheロジックレス・多言語JS/Ruby/Go 等にも実装あり。{{var}} のみ

Twig の基本

{# layout.twig - 共通レイアウト #}



  {% block title %}デフォルト{% endblock %}


  
共通ヘッダー
{% block content %}{% endblock %}
© {{ "now"|date("Y") }}
{# page.twig - 継承 #} {% extends "layout.twig" %} {% block title %}記事一覧{% endblock %} {% block content %}

{{ pageTitle }}

{% if articles is not empty %}
    {% for a in articles %}
  • {{ a.title }} ({{ a.views|number_format }} views)
  • {% else %}
  • 記事がありません
  • {% endfor %}
{% endif %} {# 自動エスケープ #} {{ user.name }} {# @endpush

コンポーネント(Blade の現代的な機能):

{{-- resources/views/components/alert.blade.php --}}
@props(['type' => 'info'])

{{ $slot }}
{{-- 使用 --}} 保存しました!

Smarty / Plates / Mustache の例

{* Smarty 4 *}
{extends file="layout.tpl"}
{block name="content"}
  

{$pageTitle|escape}

{foreach $articles as $a}
  • {$a.title|escape}
  • {/foreach} {/block}
    layout('layout', ['title' => $pageTitle]);
    ?>
    

    e($pageTitle) ?>

  • e($a['title']) ?>
  • {{! Mustache - ロジックレス }}
    

    {{pageTitle}}

      {{#articles}}
    • {{title}} ({{views}} views)
    • {{/articles}} {{^articles}}
    • 記事がありません
    • {{/articles}}

    選び方の指針

    状況推奨
    Laravel を使うBlade(標準・統合済)
    Symfony を使うTwig(標準・統合済)
    フレームワーク非依存・新規Twig(最も成熟)
    軽量・素の PHP に近い構文がいいPlates
    JS / Ruby と同じテンプレートを共有Mustache
    既存資産が大量にあるそのまま継続(Smarty 等)

    パフォーマンス: コンパイルキャッシュ

    主要エンジンは初回ロード時にテンプレートを純粋な PHP コードへコンパイルし、cache/ ディレクトリに保存します。2 回目以降はキャッシュされた PHP を require するだけなので、素の PHP と遜色ない速度になります。

    デプロイ時のキャッシュ操作:

    # Laravel Blade
    php artisan view:clear
    php artisan view:cache
    
    # Twig はコンパイル済キャッシュをクリア(手動)
    rm -rf var/cache/prod/twig
    
    # Smarty
    $smarty->clearCompiledTemplate();

    FAQ

    Q: 素の PHP では駄目?
    A: 小さなページなら可。ただし htmlspecialchars() を毎回書くのは現実的に漏れる → XSS の温床。テンプレートエンジンは自動エスケープが最大の利点。

    Q: Twig と Blade はどちらが速い?
    A: 大きな差はなし。両方とも初回コンパイル後はキャッシュされた PHP として動く。OPcache 有効化のほうが影響大。

    Q: テンプレートに DB クエリを書いていい?
    A: 非推奨。表示ロジックとデータ取得は分離(MVC)。テンプレート内では 渡された変数を表示するだけに留めるとメンテしやすい。

    編集
    Post Share
    子ページ
    1. Thymeleaf
    同階層のページ
    1. インストール(eclipseプラグイン)
    2. クイックスタート
    3. プロジェクトの作成
    4. Spring Bootプロジェクトの作成
    5. Spring Bootプロジェクトの実行
    6. Spring BootでHello World!
    7. アノテーション一覧
    8. DB接続設定からエンティティおよびリポジトリの作成、値の取得まで(JPA編)
    9. DB接続設定や値の取得(JdbcTemplate編)
    10. ビューから値をモデルに格納しコントローラーで受け取る方法
    11. コントローラーにてモデルに値を格納してビューに渡す方法
    12. テンプレートエンジン
    13. ModelとModelAndViewの違い
    14. AOPの使用方法
    15. classpath: 内部ファイルの読み込み
    16. file: 外部ファイルの読み込み
    17. CSVファイルアップロード方法(Ajax)
    18. CSVファイルダウンロード方法(Ajax)
    19. Spring Bootプロジェクトのビルドと本番環境へのデプロイ方法(内部tomcat使用)
    20. Application.propertiesの環境依存設定の分割方法
    21. JPAにおけるEntityManagerの取得方法
    22. JPAにおけるjava.sql.Connectionの取得方法
    23. エラー一覧
    24. jarの引数を受け取る方法
    25. Spring BootでGmailからメール送信
    26. 複数のDBに接続する設定(Spring Boot & JPA編)
    27. ポート番号の変更
    28. Basic認証の実装と特定のURLに限定する方法
    29. Spring SecurityのBasic認証の無効化
    30. 独自のエラーページを定義する方法
    31. プロパティファイルの値やjar実行時の引数を取得する方法