カテゴリ: Symfony 更新日: 2026/03/28

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(シンフォニー)を使ったWeb開発では、「フォームの枠組みを作る作業」「画面(Twig)に映し出す作業」を分けて考えます。プログラミングが初めての方でも、役割分担さえ覚えれば難しくありません。

基本の流れは、まずコントローラという司令塔で「どんな項目が必要か」を定義したフォームを作成し、それをTwig(トゥイグ)というテンプレートエンジンに橋渡しして画面に表示させます。PHPとHTMLが混ざらず、スッキリとした構造で書けるのがSymfonyの強みです。

初心者向け:名前入力フォームの作成例

まずは、コントローラ側で「name」という入力欄を1つだけ持つフォームを準備する、もっともシンプルなコード例を見てみましょう。


// コントローラ内での記述イメージ
$form = $this->createFormBuilder()
    ->add('name', TextType::class, [
        'label' => 'お名前',
        'attr' => ['placeholder' => '例:山田 太郎']
    ])
    ->getForm();

// Twigテンプレートへフォームを渡す
return $this->render('contact/index.html.twig', [
    'form' => $form->createView(),
]);

次に、受け取ったフォームをTwigで表示する方法です。Symfonyにはフォームを簡単に描画するための便利な命令が用意されています。


{# templates/contact/index.html.twig #}
<h2>お問い合わせ</h2>

{# フォームの開始タグから終了タグまでを自動生成 #}
{{ form_start(form) }}
    <div class="form-group">
        {# ラベル、入力欄、エラー表示をセットで出力 #}
        {{ form_row(form.name) }}
    </div>
    
    <button type="submit" class="btn btn-primary">送信する</button>
{{ form_end(form) }}

ここがポイント!
form_row という魔法の1行を書くだけで、HTMLの <label><input> タグが自動的に生成されます。自分で複雑なHTMLコードを書く必要がないため、タイピングミスやタグの閉じ忘れといった初心者特有のミスを格段に減らすことができます。

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
Laravel
Laravelのルーティングでサブドメインを使う方法!初心者向けにやさしく解説
New2
Laravel
Laravelでマルチ言語ルートを設定する方法!ロケールごとのprefixで簡単管理
New4
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方
No.2
Java&Spring記事人気No2
Symfony
SymfonyのRemember Me機能を完全解説!初心者でもわかるログイン保持の仕組み
No.3
Java&Spring記事人気No3
Laravel
Laravelでルートに中間処理を追加する方法!ミドルウェア活用ガイド
No.4
Java&Spring記事人気No4
Laravel
Laravelでログを出力する方法(Monolog・storage/logs)
No.5
Java&Spring記事人気No5
Laravel
Laravelでドメインルートを使う方法!マルチドメイン対応を初心者向けに解説
No.6
Java&Spring記事人気No6
Laravel
LaravelのFeatureテストとUnitテストの違いを理解しよう
No.7
Java&Spring記事人気No7
CodeIgniter
CodeIgniterで多言語対応(Language)を徹底解説!言語切り替え機能を実装
No.8
Java&Spring記事人気No8
CodeIgniter
CodeIgniterでファイルアップロードとストレージ管理をマスター!初心者向け完全ガイド