カテゴリ: Symfony 更新日: 2026/02/16

Twigのblockとextendsを完全マスター!初心者向けSymfonyテンプレート入門

Twigのブロック定義(block)と内容の挿入(extends)
Twigのブロック定義(block)と内容の挿入(extends)

先生と生徒の会話形式で理解しよう

生徒

「SymfonyのTwigってよく聞くけど、どうやってテンプレートを使いまわすの?」

先生

「それはTwigのextendsblockという機能を使うことでできますよ。」

生徒

「難しそう……。でも、覚えると便利そうですね!」

先生

「安心してください。基本から順番に、わかりやすく解説していきますね!」

1. Twigとは?初心者でもわかるテンプレートエンジンの基本

1. Twigとは?初心者でもわかるテンプレートエンジンの基本
1. Twigとは?初心者でもわかるテンプレートエンジンの基本

Symfony(サンフォニー)でウェブサイトの画面を作る際、欠かせないのがTwig(トゥイッグ)という「テンプレートエンジン」です。プログラミング未経験の方には聞き馴染みがない言葉かもしれませんが、一言でいうと「HTMLをより便利に、スマートに書くための道具」だと考えてください。

通常のHTMLだけでは、例えば「ユーザーの名前をページごとに変える」といった動的な表示が苦手です。しかし、Twigを使えば、HTMLの中に簡単なプログラムのような命令を組み込むことができます。

【イメージ例:名前を表示する】

たとえば、PHPから「名前(name)」というデータを受け取って表示する場合、Twigなら以下のように直感的に書けます。


<p>こんにちは、{{ name }}さん!</p>

実行結果(ブラウザに表示される内容):


こんにちは、山田太郎さん!

このように、{{ }} という特殊な記号(二重中かっこ)を使うだけで、中身を自由に入れ替えられるのが大きな特徴です。また、記事のヘッダーやフッターといった、どのページでも必ず使う「共通パーツ」を一箇所で管理できるため、修正作業が劇的に楽になります。

「コードの書き直しを減らし、ミスを防ぎながら効率よくサイトを作る」。それが、現代のウェブ開発においてTwigが選ばれている最大の理由です。

2. extendsとblockの役割とは?

2. extendsとblockの役割とは?
2. extendsとblockの役割とは?

Twigでテンプレートを分けて再利用するには、extends(エクステンズ)block(ブロック)という2つの命令を使います。

  • extends:別のテンプレートを「継承」して使うための命令
  • block:テンプレートの中で変更可能な「領域(ブロック)」を定義するための命令

つまり、共通のテンプレートを用意し、それをベースに他のテンプレートを作るという考え方です。

3. 親テンプレートを作ってみよう(layout.html.twig)

3. 親テンプレートを作ってみよう(layout.html.twig)
3. 親テンプレートを作ってみよう(layout.html.twig)

まずは共通のレイアウトファイル(親テンプレート)を作ります。このファイルには、HTMLの基本構造やヘッダー・フッターなどを記述し、コンテンツ部分にblockを定義します。


<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>{% block title %}マイサイト{% endblock %}</title>
  </head>
  <body>
    <header>
      <h1>共通ヘッダー</h1>
    </header>

    <main>
      {% block body %}{% endblock %}
    </main>

    <footer>
      <p>共通フッター</p>
    </footer>
  </body>
</html>

{% block %}で囲んだ部分が、子テンプレートで変更できる領域になります。

4. 子テンプレートで内容を挿入しよう(home.html.twig)

4. 子テンプレートで内容を挿入しよう(home.html.twig)
4. 子テンプレートで内容を挿入しよう(home.html.twig)

次に、親テンプレートをextendsして、特定のページ用のテンプレート(子テンプレート)を作ってみましょう。


{% extends 'layout.html.twig' %}

{% block title %}トップページ{% endblock %}

{% block body %}
  <p>ようこそ!これはトップページのコンテンツです。</p>
{% endblock %}

{% extends %}を使うことで、親テンプレートのレイアウトが自動的に読み込まれ、blockで定義された場所に中身が挿入されます。

5. Twigで共通デザインを保つメリットとは?

5. Twigで共通デザインを保つメリットとは?
5. Twigで共通デザインを保つメリットとは?

Twigのextendsblockを使うことで、同じデザインのテンプレートを複数のページで再利用できます。これは、メンテナンス性作業効率の面で大きなメリットがあります。

例えば、ヘッダーに変更があった場合でも、親テンプレート(layout.html.twig)を修正すれば、すべてのページに自動で反映されるため、個別に修正する必要がありません。

6. Twigを使う上での注意点

6. Twigを使う上での注意点
6. Twigを使う上での注意点
  • 親テンプレートと子テンプレートのファイル名は正しく書きましょう。
  • extendsは必ずテンプレートの一番上に書く必要があります。
  • blockの名前(titleやbodyなど)は親子で一致している必要があります。

これらを守ることで、Twigのテンプレートは正しく動作します。

7. 実行結果のイメージ

7. 実行結果のイメージ
7. 実行結果のイメージ

上記のテンプレートを組み合わせた場合、最終的な出力は以下のようになります。


<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>トップページ</title>
  </head>
  <body>
    <header>
      <h1>共通ヘッダー</h1>
    </header>

    <main>
      <p>ようこそ!これはトップページのコンテンツです。</p>
    </main>

    <footer>
      <p>共通フッター</p>
    </footer>
  </body>
</html>

このように、HTMLの構造を保ちながら、ページごとに中身を変えることができます。

8. Twigテンプレートの活用例

8. Twigテンプレートの活用例
8. Twigテンプレートの活用例

Twigテンプレートは、次のような場面で特に活躍します。

  • ブログ記事一覧ページと記事詳細ページでレイアウトがほぼ同じとき
  • 管理画面とユーザー画面で共通の見た目を使いたいとき
  • レスポンシブ対応のヘッダー・フッターを一括管理したいとき

こうした場面では、Twigのblockextendsを活用することで、作業量がぐっと減り、デザインの統一感も保てます。

まとめ

まとめ
まとめ

ここまで、Symfonyフレームワークで標準採用されているテンプレートエンジン「Twig」の核となる機能、extends(継承)block(ブロック)について詳しく解説してきました。Web開発において、同じコードを何度も書く「重複」は、バグの温床になるだけでなく、修正が必要になった際に膨大な作業時間を消費する原因となります。Twigの継承システムを導入すれば、サイト全体の骨組みを一度定義するだけで、各ページのデザインの一貫性を保ちながら、保守性の高いコードを実現できることがお分かりいただけたかと思います。

Twigテンプレート活用のポイント再確認

効率的なWeb制作を行うために、以下の3つのポイントを常に意識しておきましょう。

  • ベースレイアウトの設計: headタグ内のメタ情報や、共通のCSS・JavaScriptの読み込み、ナビゲーションメニューなどは必ず親テンプレート(layout.html.twigなど)に集約させます。
  • 適切なブロック分割: 子テンプレートで書き換える可能性がある場所は、あらかじめ{% block 名前 %}で定義しておきます。特にタイトル、メインコンテンツ、サイドバー、カスタムスクリプト領域などが一般的です。
  • コードの再利用性: 部分的なコンポーネント(ボタンやカードUIなど)は、includeタグなども併用することで、さらに細かく再利用が可能です。

実践的なPHPとTwigの連携サンプル

実際にSymfonyのコントローラーからTwigを呼び出す際のPHPコードの書き方をおさらいしましょう。コントローラー側で変数を定義し、それをテンプレートに渡すことで、動的なページ生成が可能になります。


namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class PageController extends AbstractController
{
    /**
     * @Route("/home", name="app_home")
     */
    public function index(): Response
    {
        // テンプレートに渡すデータを用意
        $user_name = 'Web太郎';
        $items = ['PHP', 'Symfony', 'Twig', 'Doctrine'];

        // renderメソッドで子テンプレートを指定し、配列でデータを渡す
        return $this->render('home.html.twig', [
            'name' => $user_name,
            'items' => $items,
        ]);
    }
}

次に、このデータを受け取る子テンプレート(home.html.twig)の記述例です。親から継承しつつ、PHPから渡された配列をループ処理で表示する例を見てみましょう。


{% extends 'layout.html.twig' %}

{% block title %}マイページ - {{ name }}{% endblock %}

{% block body %}
    <h2>こんにちは、{{ name }}さん!</h2>
    <p>学習中の技術一覧:</p>
    <ul>
        {% for item in items %}
            <li>{{ item }}</li>
        {% endfor %}
    </ul>
{% endblock %}

このように、PHP側のロジックと、HTML側のデザイン(Twig)を明確に切り分けることで、チーム開発での分業もしやすくなります。デザイナーはTwigファイルを、エンジニアはPHPファイルをといった具合に、お互いの領域を汚さずに開発を進められるのがSymfonyとTwigの最大の強みです。

Twig習得へのステップアップ

基本のextendsblockに慣れてきたら、次は「フィルター(filters)」や「関数(functions)」、そして「マクロ(macros)」についても学んでみてください。例えば、日付を特定のフォーマットで表示したり、文字列を加工したりする処理が、テンプレート内で非常にスマートに記述できるようになります。Twigを使いこなすことは、モダンなPHP開発者としてステップアップするための必須条件と言っても過言ではありません。

先生と生徒の振り返り会話

生徒

「先生、ありがとうございました!extendsblockの関係がやっとスッキリ理解できました。親テンプレートがいわば『台本』で、子テンプレートがその『役者(中身)』を入れ替えるようなイメージですね!」

先生

「その例え、すごく分かりやすいですね!まさにその通りです。共通の台本(レイアウト)があれば、演出(コンテンツ)を変えるだけで、何十ページものWebサイトを簡単に管理できるようになるんですよ。」

生徒

「今までは、全ページに同じヘッダーをコピペして貼り付けていました……。もしロゴ画像が変わったら全部のファイルを直さなきゃいけないから、冷や汗ものですよね。Twigを使えば、親テンプレートの1箇所を変えるだけで済むから、ミスも減りそうです。」

先生

「そうですね。Web制作の現場では『DRY(Don't Repeat Yourself)』、つまり同じことを繰り返さないという原則がとても大切です。PHPのコントローラーから渡したデータも、Twigなら{{ name }}のように二重中括弧で簡単に表示できますし、セキュリティ対策(エスケープ処理)も自動で行ってくれるので安心です。」

生徒

「なるほど。さっきのサンプルコードで見せてもらったfor文でのループも、HTMLがスッキリして見やすかったです。条件によって表示を変えるif文なんかも同じように使えるんですよね?」

先生

「もちろんです。例えばログインしている時だけメニューを出すといった処理も、テンプレート内で簡単に書けますよ。これからもっと複雑なサイトを作っていくことになりますが、このTwigの基礎さえしっかり押さえておけば、どんな大規模なサイトでも怖くありません。自信を持って進んでいきましょう!」

生徒

「はい!どんどんコードを書いて、自分だけのオリジナルサイトを作ってみます。Symfonyの学習がもっと楽しくなってきました!」

関連記事:
カテゴリの一覧へ
新着記事
New1
CodeIgniter
CodeIgniterでRESTful API開発!初心者でもわかる全体構成ガイド
New2
Symfony
Symfonyのコントローラとは?作成・構造・役割を初心者向けにやさしく解説!
New3
Symfony
Symfonyでバリデーションメッセージを多言語対応する方法!初心者でもわかる国際化の基本
New4
Symfony
Symfonyのキャッシュ機構の基本を理解しよう(HTTPとアプリ別)
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelのシングルアクションコントローラとは?使い方と利点
No.2
Java&Spring記事人気No2
Laravel
Laravelで動的パラメータをルートに渡す方法!初心者にもやさしいルートパラメータの使い方入門
No.3
Java&Spring記事人気No3
Laravel
LaravelのBlade構文まとめ!@if @foreach など基本ディレクティブ解説
No.4
Java&Spring記事人気No4
Laravel
Laravelでキャッシュを使う方法(ファイル・Redis・Memcached)
No.5
Java&Spring記事人気No5
Symfony
Symfonyの依存性注入(DI)とは?コンストラクタでの注入方法を初心者向けに徹底解説
No.6
Java&Spring記事人気No6
Laravel
Laravelで名前付きルートを設定する方法!初心者でもわかるroute()関数の使い方
No.7
Java&Spring記事人気No7
Laravel
Laravelのマイグレーション履歴を確認する方法を徹底解説!migrate:statusの使い方
No.8
Java&Spring記事人気No8
Laravel
Laravelのルート一覧を確認する方法!初心者でもわかるphp artisan route:listの使い方