Symfonyでバリデーションエラーを表示する方法!初心者でもわかるテンプレート活用術
生徒
「Symfonyで、入力ミスがあったときにエラーメッセージを画面に表示するにはどうすればいいですか?」
先生
「いい質問ですね。Symfonyでは、バリデーションエラーをTwigテンプレートで表示する方法がありますよ。」
生徒
「テンプレートってなんですか?難しそう…」
先生
「テンプレートとは、画面の見た目を作るためのファイルです。SymfonyではTwigというテンプレートエンジンを使って、バリデーションエラーも表示できますよ!」
1. Symfonyのバリデーションとは?
Symfony(シンフォニー)は、PHPの人気フレームワークの一つで、ウェブアプリケーションを効率よく開発できます。バリデーションとは、ユーザーが入力したデータが正しいかどうかを確認する機能のことです。たとえば、「メールアドレスの形式が正しいか」や「名前が空欄でないか」などをチェックできます。
2. エラーメッセージを表示する理由
入力フォームにバリデーションを設定しただけでは、ユーザーには何が間違っていたのか分かりません。そこで、エラー内容を画面にわかりやすく表示する必要があります。これにより、ユーザーは修正方法が分かり、スムーズに再入力できます。
3. Twigテンプレートでのエラー表示の基本
Symfonyでは、テンプレートにTwig(ツイッグ)というテンプレートエンジンを使って画面を作ります。Twigを使えば、フォームの各フィールドに対して、エラーメッセージを表示することができます。
たとえば、次のようにエラーを表示できます。
{{ form_start(form) }}
{{ form_row(form.name) }}
{{ form_row(form.email) }}
{{ form_row(form.password) }}
<button type="submit">送信</button>
{{ form_end(form) }}
このようにform_rowを使うと、ラベル・入力欄・エラーメッセージがまとめて表示されます。
4. エラーだけ個別に表示するには?
もし、エラーメッセージだけを個別に表示したい場合は、form_errorsを使います。
<div>
{{ form_label(form.email) }}
{{ form_widget(form.email) }}
{{ form_errors(form.email) }}
</div>
これで、「メールアドレスが空です」などのバリデーションエラーを、項目ごとに表示することができます。
5. 全体のエラーを一括で表示する方法
フォームの上部などに、全てのバリデーションエラーをまとめて表示したいときもありますよね。その場合は、form_errors(form)を使えばOKです。
{% if not form.vars.valid %}
<div class="alert alert-danger">
{{ form_errors(form) }}
</div>
{% endif %}
このように書くと、フォーム全体のエラーを最初にまとめて表示することができます。
6. バリデーションルールの設定と関連付け
バリデーションエラーは、エンティティの中で設定されたルールに基づいて発生します。たとえば、「名前が空ならエラー」といった指定をします。
use Symfony\Component\Validator\Constraints as Assert;
class User
{
#[Assert\NotBlank(message: "名前は必須です。")]
private $name;
#[Assert\Email(message: "メールアドレスの形式が正しくありません。")]
private $email;
}
このようにエンティティに設定したルールが、テンプレートにエラーとして表示される流れになります。
7. エラーメッセージのカスタマイズ
エラーの文章を変更したい場合は、バリデーションの定義にmessageを指定します。これにより、ユーザーにわかりやすい日本語のメッセージを表示できます。
たとえば次のように書きます:
#[Assert\NotBlank(message: "名前を入力してください。")]
8. 入力ミスを直してもらう工夫
エラーを表示するだけでなく、どの項目でミスがあったのかが一目でわかるデザインも大切です。Bootstrap5を使えば、フォームにis-invalidクラスを追加して、赤い枠線を出すことも可能です。
<input type="text" class="form-control is-invalid">
このようにすれば、視覚的にも「ここにエラーがあります」と伝えることができます。
9. バリデーション表示の実行結果例
メールアドレスの形式が正しくありません。