Symfonyのフォームでバリデーションエラーを表示する方法を完全ガイド!初心者でもわかるフォーム作成の基本
生徒
「Symfonyでフォームを作るときに、入力ミスがあったら画面にエラーを表示したいんですが、どうしたらいいんですか?」
先生
「Symfonyには、入力を自動でチェックするバリデーション機能があり、フォームと連携させることで簡単にエラーを表示できますよ。」
生徒
「画面の下に赤い文字で『この項目は必須です』みたいに出したいんです。どう設定するんでしょうか?」
先生
「Twigテンプレートでフォームとエラーメッセージの表示を組み合わせれば実現できます。では、基本から順番に説明していきましょう。」
1. Symfonyのバリデーションとは?フォームとの関係を理解しよう
Symfonyのフォームは、入力されたデータをエンティティにマッピングし、その内容をチェックする仕組みを持っています。この「チェック」こそが バリデーション(入力検証)です。例えば「空欄禁止」「メール形式チェック」「文字数制限」などを自動で判定してくれます。
フォームに入力した内容がルールに合わなかった場合、Symfonyはエラーメッセージを生成してフォームに紐付けます。Twigテンプレートでそのエラーを表示することで、 ユーザーにわかりやすいフィードバックを返せる仕組みです。
2. エンティティにバリデーションルールを設定する
バリデーションは主にエンティティに書きます。例えば「名前」フィールドに空欄禁止ルールを設定する場合は、次のようにアノテーションを使います。
use Symfony\Component\Validator\Constraints as Assert;
class User
{
#[Assert\NotBlank(message: "名前は必須項目です。")]
private $name;
}
これで名前が空欄だった場合、Symfonyが自動で「名前は必須項目です。」というエラーを生成してくれます。
3. コントローラでフォームを処理するときの流れ
フォームが送信されたら、コントローラでエラーチェックを行います。入力が正しいかどうかは $form->isValid() を使って判定できます。
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// データ保存処理
} else {
// エラーが発生している状態でテンプレートに返す
}
バリデーションエラーがあると isValid() は false になり、Twig側でエラーを表示できます。
4. Twigでバリデーションエラーを表示する方法
SymfonyのTwigには、フォームのエラーを自動表示する便利な関数が用意されています。 最も簡単なのは {{ form_errors(form) }} を使う方法です。
■ フォーム全体のエラーを表示
{{ form_errors(form) }}
■ 各フィールドごとのエラーを表示
<div>
{{ form_label(form.name) }}
{{ form_widget(form.name) }}
{{ form_errors(form.name) }}
</div>
各フィールド専用のエラーメッセージが表示されるため、ユーザーにとって非常にわかりやすいフォームになります。
5. エラーのデザイン(Bootstrapと組み合わせて綺麗に表示)
SymfonyはBootstrapと相性がよく、エラー内容を赤文字で表示したり、 入力欄に赤枠を付けたりできます。Bootstrapを使うと、次のようなレイアウトになります。
<div class="mb-3">
{{ form_label(form.email) }}
{{ form_widget(form.email, {'attr': {'class': 'form-control'}}) }}
<div class="text-danger">
{{ form_errors(form.email) }}
</div>
</div>
text-danger クラスによりエラーメッセージが赤色で表示され、ユーザーに改善ポイントがはっきり伝わります。
6. フォーム全体でエラーをまとめて表示する方法
例えば「メールアドレスがすでに登録されています」のようにフィールド単位ではないエラーもあります。 そういった場合はフォームの冒頭にエラー一覧をまとめて出すことができます。
{{ form_errors(form) }}
{{ form_start(form) }}
{{ form_row(form.name) }}
{{ form_row(form.email) }}
{{ form_end(form) }}
form_errors(form) をフォーム上部に置くことで、全体エラーが表示され、個別入力欄には個別エラーが表示されるという構造を作れます。
7. バリデーションエラー表示の仕組み(初心者にもわかる図解イメージ)
Symfonyの流れは以下のイメージです。
- ① ユーザーがフォームに入力して送信する
- ② Symfonyがエンティティのバリデーションルールと照合する
- ③ エラーがあればフォームオブジェクトへ紐付けられる
- ④ Twigテンプレートで form_errors を使ってエラー表示
このように Symfony が裏側で「判定 → エラー保存 → 描画」を自動で行うため、 開発者は表示部分だけを整えるだけでよいという仕組みになっています。