ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
なぜテンプレートエンジンを使うのか
素の PHP でも HTML を出力できますが、以下の問題があります:
- HTML エスケープが手動 → 漏れると XSS
- ロジックと表示が混在しやすく可読性が悪い
- 共通レイアウトの継承が冗長(毎ファイルにヘッダー・フッターの include)
- 非エンジニア(デザイナー)に PHP を触らせたくない
テンプレートエンジンはこれらを制約付き構文 + 自動エスケープで解決します。
5 大テンプレートエンジンの比較
| エンジン | 用途 | 特徴 |
|---|---|---|
| Twig | Symfony / フレームワーク非依存 | モダン・高速・継承・サンドボックス。Drupal でも採用 |
| Blade | Laravel 専用 | @directive 構文・コンポーネント・スロット |
| Smarty | 老舗 (2001-) | 歴史長くドキュメント豊富。記法はやや古い |
| Plates | 素の PHP に近い | 独自構文学習不要・軽量・継承サポート |
| Mustache | ロジックレス・多言語 | JS/Ruby/Go 等にも実装あり。{{var}} のみ |
Twig の基本
{# layout.twig - 共通レイアウト #}
{% block title %}デフォルト{% endblock %}
共通ヘッダー
{% block content %}{% endblock %}
{# 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]);
?>
= $this->e($pageTitle) ?>
= $this->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)。テンプレート内では 渡された変数を表示するだけに留めるとメンテしやすい。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
同階層のページ
- インストール(eclipseプラグイン)
- クイックスタート
- プロジェクトの作成
- Spring Bootプロジェクトの作成
- Spring Bootプロジェクトの実行
- Spring BootでHello World!
- アノテーション一覧
- DB接続設定からエンティティおよびリポジトリの作成、値の取得まで(JPA編)
- DB接続設定や値の取得(JdbcTemplate編)
- ビューから値をモデルに格納しコントローラーで受け取る方法
- コントローラーにてモデルに値を格納してビューに渡す方法
- テンプレートエンジン
- ModelとModelAndViewの違い
- AOPの使用方法
- classpath: 内部ファイルの読み込み
- file: 外部ファイルの読み込み
- CSVファイルアップロード方法(Ajax)
- CSVファイルダウンロード方法(Ajax)
- Spring Bootプロジェクトのビルドと本番環境へのデプロイ方法(内部tomcat使用)
- Application.propertiesの環境依存設定の分割方法
- JPAにおけるEntityManagerの取得方法
- JPAにおけるjava.sql.Connectionの取得方法
- エラー一覧
- jarの引数を受け取る方法
- Spring BootでGmailからメール送信
- 複数のDBに接続する設定(Spring Boot & JPA編)
- ポート番号の変更
- Basic認証の実装と特定のURLに限定する方法
- Spring SecurityのBasic認証の無効化
- 独自のエラーページを定義する方法
- プロパティファイルの値やjar実行時の引数を取得する方法
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Laravel キャッシュクリア完全ガイド(cache:clear / config:clear / 2026-05-18 07:42:07
- プロジェクトの作成と削除 2026-05-18 07:42:07
- インストール直後にNetbeansが反応しない 2026-05-18 07:42:07
- 動画やチャンネルの検索 2026-05-18 07:42:07
- APIキー取得方法 2026-05-18 07:42:07
- チャンネル情報の取得 2026-05-18 07:42:07
- API 入門 — Web API(REST / GraphQL / gRPC / 2026-05-18 07:42:07
- インストール(eclipseプラグイン) 2026-05-18 07:42:07
- Laravel「Dotenv values containing spaces must be surrounded 2026-05-18 07:42:07
- エラー一覧 2026-05-18 07:42:07
- curl: (51) SSL: certificate subject name '~' does not match 2026-05-18 07:42:07
- インストール方法(Windows版) 2026-05-18 07:42:07
- JSONから配列に変換 2026-05-18 07:42:07
- 処理を一定時間待つ 2026-05-18 07:42:07
- A non well formed numeric value encountered 2026-05-18 07:42:07
コメントを削除してもよろしいでしょうか?