Symfonyでフォーム送信後の再表示と入力保持を実装する方法!初心者向けに丁寧解説
生徒
「先生、Symfonyでフォームを送信したあとに、入力した内容が消えちゃうんです…どうしたら入力を保持できますか?」
先生
「Symfonyにはフォーム再表示と入力保持の仕組みが用意されているので、それを使えば大丈夫ですよ。」
生徒
「再表示って、エラーが出たときにも同じ画面に戻るってことですよね?」
先生
「そのとおりです。入力チェックでエラーがあったときに、もう一度同じフォーム画面に戻して、入力内容もそのまま表示させる方法を紹介しますね。」
1. Symfonyのフォーム処理の基本
Symfonyでは、Formコンポーネントを使ってフォームを作成し、リクエストを処理します。
フォームの入力を受け取るには、リクエストオブジェクトを使ってデータをバインド(関連付け)します。そして、エラーがある場合は、同じテンプレートに戻すことで、再表示と入力の保持が自動で行われます。
2. コントローラ側の基本的な書き方
フォーム送信後の再表示と入力保持を実現するには、コントローラで以下のように処理します。
use App\Entity\User;
use App\Form\UserType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class UserController extends AbstractController
{
public function register(Request $request): Response
{
$user = new User();
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// 保存処理など
return $this->redirectToRoute('success');
}
return $this->render('user/register.html.twig', [
'form' => $form->createView(),
]);
}
}
ポイント解説:
handleRequest():送信されたデータをフォームに適用isSubmitted():フォームが送信されたかどうかを確認isValid():バリデーションが成功したかどうかを確認- 失敗時は同じテンプレートを再表示する
3. Twigテンプレートでのフォーム表示
フォームを表示するテンプレート(HTML)では、form_start や form_widget を使うことで、Symfonyが自動的に入力内容を再描画してくれます。
{# templates/user/register.html.twig #}
{{ form_start(form) }}
{{ form_row(form.name) }}
{{ form_row(form.email) }}
{{ form_row(form.password) }}
<button type="submit" class="btn btn-primary">送信</button>
{{ form_end(form) }}
form_row はラベル、入力欄、エラーメッセージをまとめて出力してくれる便利な関数です。
4. バリデーションエラー時の再表示
入力に不備があった場合でも、同じフォーム画面が表示され、ユーザーが入力した内容はそのまま保持されます。
たとえば、メールアドレスが空だったときは、次のような画面になります。
メールアドレスを入力してください
しかも、他の入力欄の内容は失われず、そのまま表示されるので、ユーザーの再入力の手間が省けます。
5. 入力保持の仕組み
Symfonyのフォームは、バインドされたエンティティにデータを一時的に保存し、Twig側で再描画するときにその値を使ってくれます。
この仕組みのおかげで、入力保持の処理を自分で書かなくても、標準で実現できます。
6. リダイレクト先で入力内容を保持したい場合は?
通常の再表示ではなく、別の画面にリダイレクトしたいけど、入力内容も保持したいというケースもあります。
このようなときは、セッションという仕組みを使って、一時的にデータを保存しておき、次のページで取り出して使います。
$session = $request->getSession();
$session->set('form_data', $form->getData());
そしてリダイレクト先で次のように取り出します。
$formData = $session->get('form_data');
ただし、通常のフォーム画面でのエラー再表示なら、セッションを使わなくても自動で入力保持されます。
7. 画面デザインでの注意点
フォームのUI(ユーザーインターフェース)を作るときに、以下の点を意識すると親切です。
- 必須項目には「※必須」などのラベルを付ける
- エラー表示は目立つ色(赤など)で表示する
- 再送信時に入力が消えていないことを確認する
SymfonyではBootstrapと組み合わせることで、見た目もきれいなフォームを簡単に作れます。
まとめ
今回は、Symfonyでフォーム送信後に同じ画面へ再表示する方法と、入力保持を実現する仕組みについて詳しく解説しました。Symfonyのフォームコンポーネントを使うことで、フォーム処理、バリデーション、エラーメッセージ表示、入力値の保持までを一貫して管理できることが理解できたと思います。
Symfonyのフォーム処理では、コントローラでcreateFormを使ってフォームを生成し、handleRequestでリクエストデータをバインドします。そしてisSubmittedとisValidを組み合わせることで、送信済みかどうか、そしてバリデーションが成功したかどうかを判定します。この流れを正しく理解することが、Symfonyフォーム実装の基礎になります。
特に重要なのは、バリデーションエラー時に同じテンプレートをrenderで再表示するだけで、入力内容が自動的に保持される点です。これはSymfonyがエンティティにフォームデータをバインドし、その状態をTwigテンプレートで再描画しているためです。つまり、入力保持のために特別なコードを書く必要はありません。
Twigテンプレートでは、form_start、form_row、form_endを使うことで、ラベル、入力欄、エラーメッセージがまとめて出力されます。これにより、フォーム再表示時もユーザーが入力した値がそのまま表示され、ユーザビリティが大きく向上します。SymfonyとTwigの連携は非常に強力で、初心者でも実践的なフォーム処理を実装できます。
また、通常のエラー再表示ではなく、リダイレクト後に入力内容を保持したい場合には、セッションを活用する方法も紹介しました。Requestオブジェクトからセッションを取得し、フォームデータを一時保存しておくことで、別画面でも入力値を扱うことが可能になります。このように、Symfonyでは用途に応じて柔軟なフォーム制御が行えます。
Symfonyフォーム、入力保持、フォーム再表示、バリデーション、Twigテンプレート、セッション管理といったキーワードは、Webアプリケーション開発において非常に重要な概念です。これらを正しく理解しておくことで、ユーザーに優しいフォーム設計ができるようになります。実務でも頻繁に使われる実装パターンなので、ぜひ繰り返し確認して身につけていきましょう。
サンプルプログラムで流れを再確認
ここで、フォーム送信から再表示までの基本的な流れを、もう一度コードで確認してみましょう。Symfonyのフォーム処理の王道パターンです。
public function register(Request $request): Response
{
$user = new User();
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
return $this->redirectToRoute('success');
}
return $this->render('user/register.html.twig', [
'form' => $form->createView(),
]);
}
このコードでは、フォームが送信され、かつバリデーションが成功した場合のみリダイレクトします。それ以外の場合は同じTwigテンプレートを再表示します。この再表示のタイミングで、Symfonyが自動的に入力保持を行ってくれます。
Twigテンプレート側の確認
{{ form_start(form) }}
{{ form_row(form.name) }}
{{ form_row(form.email) }}
{{ form_row(form.password) }}
<button type="submit" class="btn btn-primary">送信</button>
{{ form_end(form) }}
form_rowを使用することで、入力値とエラーメッセージが自動的に表示されます。SymfonyフォームとTwigを組み合わせることで、入力保持とエラー表示が自然に実装できることが分かります。
生徒
「Symfonyのフォーム送信後に入力が消えない理由がやっと分かりました。handleRequestでデータをバインドしているんですね。」
先生
「その通りです。フォームとエンティティが結び付いているから、Twigで再表示したときに入力保持ができるのです。」
生徒
「バリデーションエラーのときも同じ画面に戻すだけでいいのは便利ですね。自分で値をセットし直す必要がないのが助かります。」
先生
「そうですね。Symfonyフォーム、入力保持、フォーム再表示の流れを理解しておけば、実務レベルのWebアプリケーション開発でも困りません。」
生徒
「リダイレクト先で値を使いたいときはセッションを使う、というのも覚えておきます。」
先生
「その理解で大丈夫です。Symfonyのフォーム処理の基本を押さえれば、ログインフォーム、会員登録フォーム、お問い合わせフォームなど、あらゆるフォーム実装に応用できますよ。」