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

SymfonyでフォームをTwigに表示する方法を完全ガイド!初心者でもできるテンプレート入門

Twigでフォームをテンプレートに表示する基本構成
Twigでフォームをテンプレートに表示する基本構成

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

生徒

「Symfonyで作ったフォームって、どうやって画面に表示するんですか?」

先生

「Twigテンプレートを使えば、簡単にフォームを表示できますよ。」

生徒

「テンプレートってなんですか?フォームを表示するには特別な書き方があるんですか?」

先生

「テンプレートは、画面の見た目を作るファイルです。フォームを表示するためには、Twigで専用のタグを使って書くだけです。」

1. Twigとは?Symfony標準の高速テンプレートエンジン

1. Twigとは?Symfony標準の高速テンプレートエンジン
1. Twigとは?Symfony標準の高速テンプレートエンジン

Symfony(シンフォニー)でWeb開発を行う際、避けて通れないのがTwig(トゥイッグ)です。Twigは、PHPのコードの中にHTMLを混ぜて書くのではなく、「見た目(HTML)」と「ロジック(PHP)」を完全に切り離して管理するためのテンプレートエンジンです。

プログラミング未経験の方にとって、PHPのコードの中にechoforeachが入り乱れる画面作成は非常に複雑に見えますが、Twigを使えば、まるで普通のHTMLを書くような感覚で動的なコンテンツを表示できます。

未経験者向け:PHPとTwigの書き方の違い

例えば、変数 $name に入った名前を表示したい場合、これまでは以下のようなPHPの記述が必要でした。


<!-- PHPでの書き方:記号が多くて間違いやすい -->
<p>こんにちは、<?php echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8'); ?>さん!</p>

これがTwigを使うと、たったこれだけで済みます。


{# Twigでの書き方:シンプルで直感的! #}
<p>こんにちは、{{ name }}さん!</p>

このように、Twigは「二重の中括弧 {{ }}」などの直感的な記法(シンタックス)を採用しているため、コードの読みやすさが劇的に向上します。また、セキュリティ面でも、Webサイトへの攻撃(XSSなど)を防ぐための「エスケープ処理」を自動で行ってくれるため、初心者でも安全にプログラムを組めるのが大きなメリットです。

Symfonyで効率的、かつ安全にフォームやページを作成するために、Twigは欠かせないパートナーと言えるでしょう。

2. Symfonyでフォームを作ったら、Twigで表示する

2. Symfonyでフォームを作ったら、Twigで表示する
2. Symfonyでフォームを作ったら、Twigで表示する

Symfonyでは、フォームの作成とTwigでの表示が分かれています。まずは、コントローラでフォームを作り、それをTwigテンプレートに渡して、画面に表示する流れになります。

今回は「名前」を入力するだけの簡単なフォームをTwigで表示する方法を見ていきましょう。

3. コントローラでフォームを作成する

3. コントローラでフォームを作成する
3. コントローラでフォームを作成する

まずは、PHPのコントローラでフォームを作成して、Twigに渡します。以下のようなコードになります。


use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class SampleController extends AbstractController
{
    public function index(Request $request): Response
    {
        $form = $this->createFormBuilder()
            ->add('name', TextType::class)
            ->add('send', SubmitType::class, ['label' => '送信'])
            ->getForm();

        return $this->render('form/sample.html.twig', [
            'myForm' => $form->createView()
        ]);
    }
}

ここでは、createFormBuilder()というSymfonyの機能を使ってフォームを作り、render()でTwigテンプレートに渡しています。

4. Twigテンプレートにフォームを表示する方法

4. Twigテンプレートにフォームを表示する方法
4. Twigテンプレートにフォームを表示する方法

次に、Twigファイル(例:form/sample.html.twig)で、画面にフォームを表示します。Twigには、Symfonyのフォーム専用の関数が用意されていて、とても簡単に書けます。


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

{% block body %}
    <h2>名前を入力してください</h2>

    {{ form_start(myForm) }}
        {{ form_row(myForm.name) }}
        {{ form_row(myForm.send) }}
    {{ form_end(myForm) }}
{% endblock %}

form_startは、フォームのはじまりを表すタグ(HTMLでいう<form>)を自動で出力します。

form_rowは、ラベル・入力欄・エラー表示などをまとめて一行で出してくれる便利なタグです。

form_endは、フォームの終わり(</form>)を出力します。

5. 実際の表示例

5. 実際の表示例
5. 実際の表示例

ブラウザでこのTwigテンプレートを表示すると、次のようにフォームが画面に表示されます。


    名前を入力してください

    [名前の入力欄]

    [送信ボタン]

このように、Twigを使えばPHPの複雑なコードを書かなくても、簡単にフォームを画面に表示できます。

6. Twigでフォームを個別にカスタマイズする方法

6. Twigでフォームを個別にカスタマイズする方法
6. Twigでフォームを個別にカスタマイズする方法

フォーム全体を一括で表示する{{ form(myForm) }}という方法もありますが、細かく制御したい場合は、form_rowform_labelform_widgetを使い分けます。

例えば、ラベルと入力欄を別々に書く場合はこうします:


{{ form_label(myForm.name) }}
{{ form_widget(myForm.name) }}

こうすることで、デザインやレイアウトを細かくコントロールできるようになります。

7. 画面に反映されないときのチェックポイント

7. 画面に反映されないときのチェックポイント
7. 画面に反映されないときのチェックポイント
  • フォームオブジェクトをcreateView()で変換しているか
  • テンプレートに{{ form_start }}などが書かれているか
  • Twigファイルの名前とパスが正しいか
  • Symfonyキャッシュをクリアしているか

画面にフォームが出ないときは、上記を順番に見直してみてください。

8. Twigでのフォーム表示は初心者にもおすすめ

8. Twigでのフォーム表示は初心者にもおすすめ
8. Twigでのフォーム表示は初心者にもおすすめ

Twigを使えば、難しいPHPの記述なしに、視覚的にもわかりやすくフォームを作れます。Webアプリケーション開発では、ユーザーからの入力を受け取るフォームがとても重要です。

Twigはその橋渡し役として、HTMLとPHPのいいとこどりをした書き方ができるので、初心者にもやさしい構成になっています。

まとめ

まとめ
まとめ

今回の記事では、PHPの人気フレームワークであるSymfonyと、その強力なテンプレートエンジンであるTwigを組み合わせて、Webフォームを画面に表示する具体的な手順について解説してきました。初心者の方にとって、バックエンドのPHPプログラムとフロントエンドのHTML表示をどのように繋ぐかは最初の大きな壁ですが、Symfonyの「フォームコンポーネント」とTwigの「フォーム関数」を使えば、驚くほどスマートに実装できることがお分かりいただけたかと思います。

Symfonyフォームの実装フローをおさらい

Webアプリケーションでユーザー入力を受け付ける仕組みを構築する際は、以下の3つのステップが基本となります。

  • コントローラでの定義: FormBuilderを使用して、どのような入力項目(テキスト、数値、ボタンなど)が必要かを定義します。
  • Viewへの橋渡し: フォームオブジェクトをcreateView()メソッドで「Twigが理解できる形式」に変換し、テンプレートへ渡します。
  • Twigでのレンダリング: form_startform_rowといった専用の関数を使い、HTML構造を自動生成します。

実戦で役立つ高度なレンダリング手法

基本をマスターしたら、次はデザインのカスタマイズに挑戦してみましょう。記事の中で紹介した form_row は、ラベル、エラーメッセージ、入力ウィジェットをひとまとめに出力してくれますが、実際の現場では「ラベルだけを左側に、入力欄を右側に配置したい」といったレイアウト調整が必要になります。その場合は、以下のように個別のパーツを呼び出す方法が有効です。


<div class="form-group">
    <label class="custom-label">{{ form_label(myForm.name, 'お名前(必須)') }}</label>
    <div class="input-wrapper">
        {{ form_widget(myForm.name, {'attr': {'class': 'form-control', 'placeholder': '例:山田 太郎'}}) }}
    </div>
    <div class="error-msg">
        {{ form_errors(myForm.name) }}
    </div>
</div>

このように、form_widget の第二引数に attr(属性)を指定することで、HTMLの classidplaceholder をPHP側ではなく、見た目を司るTwig側から直接操作できます。これにより、デザイナーとエンジニアの分業もしやすくなるという大きなメリットがあります。

バリデーションとの連携

また、Symfonyのフォーム機能が優れているのは、見た目だけではありません。PHP側で設定した「入力必須」や「文字数制限」といったバリデーション(入力チェック)の結果を、Twigの form_errors が自動的に検知して表示してくれます。これにより、複雑なJavaScriptやif文を自前で書かなくても、ユーザーに優しいフォーム画面が完成します。

さらなるステップアップに向けて

Symfonyを学ぶ上で、Twigの習得は避けて通れません。しかし、それは決して苦労ではなく、開発効率を劇的に上げるための武器になります。まずは今回紹介した form_start, form_end, form_row の3点セットを使いこなし、少しずつ form_widget などを使った細かいカスタマイズに移行していくのが上達の近道です。

もし画面に何も表示されない場合は、必ずデバッグツールバーを確認し、コントローラから createView() が正しく渡されているか、変数名が一致しているかをチェックしましょう。一つずつ課題をクリアしていけば、Symfonyを使ったWeb開発がもっと楽しくなるはずです。

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

生徒

「先生、まとめまで読んでみて、Symfonyのフォームの仕組みがかなり整理されてきました!コントローラで中身を作って、Twigで見た目を整えるという役割分担がはっきりしているんですね。」

先生

「その通りです!役割を分けることで、コードが読みやすくなり、修正も楽になります。最初は {{ form(myForm) }} だけで全部出してしまうのも手ですが、慣れてきたら form_row を使って一つずつ項目を制御するのがおすすめですよ。」

生徒

「確かに、デザインをこだわりたいときは form_row の方が自由度が高そうですね。ところで、HTMLの input タグに自分でクラスを付けたいときはどうすればいいんですか?」

先生

「いい質問ですね。Twigの中で form_widget を使うときに、属性を指定できるんです。ちょっとコードで見てみましょうか。」


{# 属性を直接指定して、CSSクラスを追加する例 #}
{{ form_widget(myForm.name, {'attr': {'class': 'my-custom-class'}}) }}

生徒

「あ、これならBootstrapとかのCSSフレームワークも簡単に適用できそうです!あと、最後に form_end を書くのを忘れちゃいそうなんですけど、これを書かないとどうなりますか?」

先生

form_end を忘れると、HTMLの </form> 閉じタグが出力されないだけでなく、Symfonyが自動的に生成する『CSRF保護(セキュリティ用の隠しトークン)』のタグも出力されなくなってしまうんです。だから、セキュリティの観点からも絶対に忘れないでくださいね。」

生徒

「セキュリティにも関わってくるんですね……! form_startform_end はセットで書く習慣をつけます。あ、もう一つ。実際の入力結果を受け取るPHP側の処理も、同じコントローラに書けばいいんですよね?」

先生

「基本的にはそうです。$form->handleRequest($request) というコードを追加して、送信ボタンが押されたかどうかを判定します。例えばこんな感じになりますね。」


public function index(Request $request): Response
{
    $form = $this->createFormBuilder()
        ->add('name', TextType::class)
        ->add('send', SubmitType::class)
        ->getForm();

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        // ここで送信されたデータを取り出す
        $data = $form->getData();
        // $data['name'] を使ってデータベース保存などを行う
        
        return $this->redirectToRoute('success_page');
    }

    return $this->render('form/sample.html.twig', [
        'myForm' => $form->createView()
    ]);
}

生徒

「なるほど! isSubmitted でボタンが押されたかチェックして、 isValid で入力内容にエラーがないかチェックするんですね。これで入力から表示、送信後の処理まで一通りイメージが湧きました!」

先生

「完璧な理解です。Symfonyは最初は覚えることが多いように感じますが、一度パターンを掴んでしまえば、どんなに複雑なフォームでも同じ流れで作成できます。ぜひ、色々な入力タイプを試してみてください。」

生徒

「はい、ありがとうございます!まずはチェックボックスやプルダウンメニューの追加にも挑戦してみようと思います!」

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