この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:4
ページ更新者:atom
更新日時:2026-06-11 07:07:02

タイトル: テンプレートエンジン
SEOタイトル: 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)。テンプレート内では 渡された変数を表示するだけに留めるとメンテしやすい。