カテゴリ: Symfony 更新日: 2026/03/12

Symfonyでフォーム送信後の再表示と入力保持を実装する方法!初心者向けに丁寧解説

Symfonyでフォーム送信後の再表示と入力保持の実装方法
Symfonyでフォーム送信後の再表示と入力保持の実装方法

先生と生徒の会話形式で理解しよう

生徒

「先生、Symfonyでフォームを送信したあとに、入力した内容が消えちゃうんです…どうしたら入力を保持できますか?」

先生

「Symfonyにはフォーム再表示と入力保持の仕組みが用意されているので、それを使えば大丈夫ですよ。」

生徒

「再表示って、エラーが出たときにも同じ画面に戻るってことですよね?」

先生

「そのとおりです。入力チェックでエラーがあったときに、もう一度同じフォーム画面に戻して、入力内容もそのまま表示させる方法を紹介しますね。」

1. Symfonyのフォーム処理の基本

1. Symfonyのフォーム処理の基本
1. Symfonyのフォーム処理の基本

Symfonyでは、Formコンポーネントを使ってフォームを作成し、リクエストを処理します。

フォームの入力を受け取るには、リクエストオブジェクトを使ってデータをバインド(関連付け)します。そして、エラーがある場合は、同じテンプレートに戻すことで、再表示と入力の保持が自動で行われます。

2. コントローラ側の基本的な書き方

2. コントローラ側の基本的な書き方
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テンプレートでのフォーム表示

3. Twigテンプレートでのフォーム表示
3. Twigテンプレートでのフォーム表示

フォームを表示するテンプレート(HTML)では、form_startform_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. バリデーションエラー時の再表示

4. バリデーションエラー時の再表示
4. バリデーションエラー時の再表示

入力に不備があった場合でも、同じフォーム画面が表示され、ユーザーが入力した内容はそのまま保持されます。

たとえば、メールアドレスが空だったときは、次のような画面になります。


メールアドレスを入力してください

しかも、他の入力欄の内容は失われず、そのまま表示されるので、ユーザーの再入力の手間が省けます。

5. 入力保持の仕組み

5. 入力保持の仕組み
5. 入力保持の仕組み

Symfonyのフォームは、バインドされたエンティティにデータを一時的に保存し、Twig側で再描画するときにその値を使ってくれます。

この仕組みのおかげで、入力保持の処理を自分で書かなくても、標準で実現できます。

6. リダイレクト先で入力内容を保持したい場合は?

6. リダイレクト先で入力内容を保持したい場合は?
6. リダイレクト先で入力内容を保持したい場合は?

通常の再表示ではなく、別の画面にリダイレクトしたいけど、入力内容も保持したいというケースもあります。

このようなときは、セッションという仕組みを使って、一時的にデータを保存しておき、次のページで取り出して使います。


$session = $request->getSession();
$session->set('form_data', $form->getData());

そしてリダイレクト先で次のように取り出します。


$formData = $session->get('form_data');

ただし、通常のフォーム画面でのエラー再表示なら、セッションを使わなくても自動で入力保持されます。

7. 画面デザインでの注意点

7. 画面デザインでの注意点
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のフォーム処理の基本を押さえれば、ログインフォーム、会員登録フォーム、お問い合わせフォームなど、あらゆるフォーム実装に応用できますよ。」

関連記事:
カテゴリの一覧へ
新着記事
New1
Symfony
Symfonyのルーティング構成の基本を完全解説!初心者向けにYAML・PHP・アノテーション方式をやさしく紹介
New2
Laravel
Laravelのルートグループの使い方!初心者でもわかるprefixやミドルウェアの設定方法
New3
PHP
PHPのswitch文の使い方!多くの条件分岐をスッキリ書く方法と注意点
New4
Symfony
Symfony学習に役立つおすすめドキュメント・教材・リソース一覧【初心者向け】
人気記事
No.1
Java&Spring記事人気No1
PHP
PHPで文字列を結合する方法!ドット演算子と代入演算子の使い方を徹底解説
No.2
Java&Spring記事人気No2
Symfony
Symfonyで翻訳(i18n)機能を使う方法を解説!初心者にもわかる国際化対応の基本
No.3
Java&Spring記事人気No3
PHP
PHPのif文の使い方を完全ガイド!初心者でもわかる条件分岐の基本
No.4
Java&Spring記事人気No4
Laravel
Laravelのresponse()関数の使い方を完全ガイド!初心者でもわかるレスポンス制御とHTTPレスポンスの基本
No.5
Java&Spring記事人気No5
Laravel
LaravelのAPIルーティングを設定する方法!初心者でもわかるapi.phpの使い方
No.6
Java&Spring記事人気No6
CodeIgniter
CodeIgniterルーティングを完全攻略!正規表現でURLを自由自在に操る方法
No.7
Java&Spring記事人気No7
Laravel
LaravelでRemember Me(ログイン状態保持)機能を実装する方法を完全解説!初心者でも安心の認証入門
No.8
Java&Spring記事人気No8
PHP
PHPのswitch文の使い方!多くの条件分岐をスッキリ書く方法と注意点