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と組み合わせることで、見た目もきれいなフォームを簡単に作れます。