PHPのテンプレートエンジンとは、PHPで処理したデータをHTMLに埋め込み、Webページとして表示するための仕組みです。
より正確にいうと、アプリケーションの業務処理と、HTMLを組み立てるための表示ロジックを分けやすくする役割があります。
Webアプリケーションでは、データベースから取得した商品名、ユーザー名、価格、記事本文などをHTML上に表示します。
PHPだけでも実現できますが、システムの規模が大きくなると、データ取得や計算処理とHTMLの記述が混在し、コードが読みにくくなることがあります。
テンプレートエンジンを利用すると、PHP側ではデータ取得や業務処理を行い、テンプレート側では画面表示を担当するという役割分担がしやすくなります。
PHPだけでHTMLを出力する場合
PHPは、HTMLの中に直接埋め込んで使用できる言語です。
そのため、テンプレートエンジンを導入しなくても、PHPファイル自体をテンプレートとして利用できます。
<?php
$userName = '田中太郎';
$products = [
['name' => 'ノートパソコン', 'price' => 120000],
['name' => 'マウス', 'price' => 3500],
];
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>商品一覧</title>
</head>
<body>
<h1>
<?= htmlspecialchars($userName, ENT_QUOTES, 'UTF-8') ?>
さんの商品一覧
</h1>
<ul>
<?php foreach ($products as $product): ?>
<li>
<?= htmlspecialchars($product['name'], ENT_QUOTES, 'UTF-8') ?>
:
<?= number_format($product['price']) ?>円
</li>
<?php endforeach; ?>
</ul>
</body>
</html>
この書き方は間違いではありません。
PHPはもともと、HTMLに埋め込んで使えるように設計されています。
そのため、小規模なWebサイトや簡単な管理画面では、PHPファイルをそのままテンプレートとして利用することもあります。
ただし、システムが大きくなると、次のような問題が起こりやすくなります。
- HTML内にPHPコードが大量に入り込む
- データ取得処理と表示処理の境界が曖昧になる
- HTMLエスケープの記述漏れが発生しやすい
- 共通レイアウトの管理が複雑になる
- 条件分岐や繰り返しが増えると読みづらくなる
- フロントエンド担当者がバックエンド処理へ影響を与えやすくなる
こうした問題を減らすために、テンプレートエンジンが利用されます。
テンプレートエンジンの基本的な仕組み
テンプレートエンジンは、主に次の要素を組み合わせて、最終的なHTMLを生成します。
- テンプレートファイル
- PHP側から渡されたデータ
- テンプレート専用の構文
処理の流れは、おおむね次のようになります。
ブラウザからリクエストを受け取る
↓
PHPがデータを取得・処理する
↓
テンプレートへデータを渡す
↓
テンプレートエンジンがHTMLを生成する
↓
完成したHTMLをブラウザへ返す
例えば、PHP側で次のデータを用意したとします。
$userName = '田中太郎';
Twigというテンプレートエンジンでは、テンプレート側に次のように記述できます。
<h1>{{ userName }}さん、こんにちは</h1>
テンプレートエンジンによって処理されると、最終的には次のHTMLが生成されます。
<h1>田中太郎さん、こんにちは</h1>
ブラウザに送信されるのは、Twigの構文ではなく、変換後のHTMLです。
テンプレートエンジンを利用した構成
PHPで広く利用されているTwigを例に説明します。
PHP側の処理
<?php
require_once __DIR__ . '/vendor/autoload.php';
$loader = new \Twig\Loader\FilesystemLoader(__DIR__ . '/templates');
$twig = new \Twig\Environment($loader);
$products = [
['name' => 'ノートパソコン', 'price' => 120000],
['name' => 'マウス', 'price' => 3500],
];
echo $twig->render('products.html.twig', [
'userName' => '田中太郎',
'products' => $products,
]);
テンプレート側の処理
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>商品一覧</title>
</head>
<body>
<h1>{{ userName }}さんの商品一覧</h1>
<ul>
{% for product in products %}
<li>
{{ product.name }}:
{{ product.price|number_format }}円
</li>
{% endfor %}
</ul>
</body>
</html>
PHP側ではデータの取得や処理を行い、テンプレート側では受け取ったデータをHTMLとして表示します。
このように、業務処理と表示処理を分けやすくすることが、テンプレートエンジンの大きな目的です。
テンプレートエンジンが持つ主な役割
業務ロジックと表示ロジックを分ける
テンプレートエンジンを使うと、PHP側とテンプレート側の役割を整理しやすくなります。
PHP側では、次のような処理を行います。
- データベースから情報を取得する
- 入力値を検証する
- ログイン状態を確認する
- 商品価格を計算する
- アクセス権限を判定する
- メールを送信する
- 外部APIと通信する
テンプレート側では、次のような表示処理を行います。
- 見出しを表示する
- 商品一覧を表示する
- ボタンを表示する
- エラーメッセージを表示する
- 状態に応じて表示内容を切り替える
- 共通レイアウトを利用する
例えば、PHP側でログイン状態を判定します。
$isLoggedIn = isset($_SESSION['user_id']);
テンプレート側では、その結果だけを利用します。
{% if isLoggedIn %}
<a href="/mypage">マイページ</a>
{% else %}
<a href="/login">ログイン</a>
{% endif %}
テンプレートエンジンを使う目的は、テンプレートからすべてのロジックをなくすことではありません。
条件分岐や繰り返しのような表示ロジックは、テンプレート内に書くことがあります。
一方で、価格計算や購入可否判定などの業務ロジックは、PHP側で処理するのが基本です。
HTMLを読みやすくする
通常のPHPテンプレートでは、次のようなコードになることがあります。
<?php if ($isLoggedIn): ?>
<p>
<?= htmlspecialchars($userName, ENT_QUOTES, 'UTF-8') ?>
さん
</p>
<?php else: ?>
<a href="/login">ログイン</a>
<?php endif; ?>
Twigでは、次のように記述できます。
{% if isLoggedIn %}
<p>{{ userName }}さん
以上、PHPのテンプレートエンジンとはなんなのかについてでした。
最後までお読みいただき、ありがとうございました。










