SymfonyのFormTypeとバリデーションの基本を徹底解説!初心者向けフォーム設計ガイド
生徒
「Symfonyでフォームを使うとき、入力チェックってどうやってやるんですか?」
先生
「SymfonyではFormTypeクラスとバリデーション機能を組み合わせて、しっかりと入力チェックができますよ。」
生徒
「FormTypeってなんですか?バリデーションってエラーをチェックするやつですよね?」
先生
「その通りです!今回は、SymfonyでFormTypeを使いながら、入力チェック(バリデーション)を簡単に実装する方法を一緒に学んでいきましょう。」
1. FormTypeクラスとは?
Symfony(シンフォニー)のFormTypeクラスは、フォームの構造や表示内容を定義する設計図のようなものです。HTMLのformタグを直接書かずに、PHPのコードで入力欄を組み立てられるのが大きな特徴です。
たとえば、名前・メールアドレス・年齢などの入力フィールドをPHPのクラスで定義し、再利用やメンテナンスがしやすくなるメリットがあります。
2. バリデーションとは?
バリデーションとは、フォームに入力された値が正しいかをチェックする処理です。例えば、「メールアドレスの形式が正しいか?」「必須項目が空欄になっていないか?」などの確認を行います。
Symfonyでは、このバリデーション処理をアノテーション(コメントのような命令)としてエンティティに記述することで、自動的にチェックしてくれます。
3. バリデーション対象のエンティティクラスを作る
まず、バリデーション対象となるデータクラス(エンティティ)を作成します。以下のように、Assertというアノテーションを使って制限を追加します。
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class Contact
{
#[Assert\NotBlank(message: "名前を入力してください。")]
public string $name;
#[Assert\NotBlank(message: "メールアドレスを入力してください。")]
#[Assert\Email(message: "正しいメールアドレス形式で入力してください。")]
public string $email;
}
NotBlankは空欄チェック、Emailはメール形式のチェックです。
4. FormTypeでフォーム構造を定義する
次に、フォーム構造を定義するFormTypeクラスを作成します。ここで、先ほどのエンティティと連携させます。
namespace App\Form;
use App\Entity\Contact;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
class ContactType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('name', TextType::class)
->add('email', EmailType::class);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Contact::class,
]);
}
}
TextTypeはテキスト入力、EmailTypeはメール用の入力欄を作成します。
5. コントローラでフォームを表示して処理する
実際にフォームを表示し、送信されたデータをチェックする処理をコントローラに記述します。
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use App\Form\ContactType;
use App\Entity\Contact;
class ContactController extends AbstractController
{
public function contact(Request $request): Response
{
$contact = new Contact();
$form = $this->createForm(ContactType::class, $contact);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// 正常にバリデーションを通過したときの処理
return $this->redirectToRoute('success_page');
}
return $this->render('contact/form.html.twig', [
'form' => $form->createView(),
]);
}
}
isSubmitted()で送信されたかを確認し、isValid()でバリデーションが通ったかどうかを判定します。
6. Twigテンプレートでフォームを表示する
最後に、Twigテンプレートを使ってフォームを表示します。SymfonyのFormTypeと連携することで、フォームの見た目も整えられます。
{{ form_start(form) }}
{{ form_row(form.name) }}
{{ form_row(form.email) }}
<button type="submit">送信</button>
{{ form_end(form) }}
バリデーションエラーがあった場合は、自動的にエラーメッセージが表示されます。
7. Symfonyのバリデーションの強みとは?
Symfonyのバリデーションは、エンティティ+FormType+コントローラ+Twigが一体となって動作することで、再利用性の高い、安全なフォーム処理が実現できます。HTMLを自力で書くよりも、エラー処理やセキュリティ(CSRFトークン)も自動化されており、安全かつ便利です。
また、バリデーションルールを1か所(エンティティ)にまとめられるので、大規模なアプリケーションでも管理しやすくなります。