カテゴリ: Symfony 更新日: 2026/01/10

Symfonyの動的フォームフィールド追加・削除を完全ガイド!初心者でもわかるフォーム操作入門

Symfonyで動的フォームフィールドを追加・削除する方法
Symfonyで動的フォームフィールドを追加・削除する方法

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

生徒

「Symfonyで入力欄を自由に増やしたり減らしたりできるフォームを作りたいのですが、どうすればできますか?例えば、複数のメールアドレスを追加できるフォームを作りたいです。」

先生

「Symfonyでは、動的にフォームフィールドを追加したり削除したりできる仕組みが用意されています。フォームの項目を増やすのは、紙のアンケートに『追加記入欄』を貼りつけるようなイメージで理解するとわかりやすいですよ。」

生徒

「紙のアンケートみたいに追加できるんですね!どんな仕組みで増えたり減ったりするのか、もっと詳しく知りたいです。」

先生

「では、Symfonyのフォーム処理で動的フィールドを扱う方法を、ゆっくりやさしく説明していきます。」

1. Symfonyで動的フォームフィールドを扱うとは?

1. Symfonyで動的フォームフィールドを扱うとは?
1. Symfonyで動的フォームフィールドを扱うとは?

Symfonyで動的フォームフィールドを追加・削除するというのは、ユーザーが必要な数だけ入力欄を増やせるようにすることです。「メールアドレスを何個登録しますか?」というような場合、最初から入力欄を固定せず、必要に応じて増やせるのが便利です。

紙の書類にたとえると、「必要なだけ追加入力欄を足すことができる」仕組みです。Symfonyのフォームでは、このような動きができるようにするために、CollectionTypeという仕組みを使います。これは、同じ種類の入力欄を複数まとめて扱うフィールドです。

CollectionTypeは「ひとつのカテゴリを箱のようにまとめておく入れ物」と考えると理解しやすいでしょう。例えば「メールアドレスを複数入力する箱」があり、その中に個別のメールアドレス用入力欄がどんどん追加されるイメージです。

Symfonyで動的フォームと検索するとよく出てくるキーワードには、「Symfony フォーム 動的追加」「Symfony CollectionType 追加 削除」「Symfony フォーム JavaScript 動的」といったものがあります。この記事では、初心者でも理解できるように、Symfonyフォームの基本的な仕組みを中心にやさしく解説していきます。

2. 動的フォームを作るために必要な仕組み

2. 動的フォームを作るために必要な仕組み
2. 動的フォームを作るために必要な仕組み

動的フォームフィールドを扱うには、Symfonyのフォーム処理の中でも少し応用寄りの機能を使います。ですが、見た目より難しくありません。以下のような構造で動かすと理解しやすいです。

  • 複数の項目をまとめるためのCollectionTypeをフォームに追加する
  • CollectionTypeの中に入れる個別のフォーム(子フォーム)を用意する
  • JavaScriptで「項目の追加」や「項目の削除」を行うためのボタンを作る

Symfony側では「追加できる箱」をつくり、ブラウザ側ではJavaScriptを使って「箱の中に新しい項目を入れたり取り出したりする」イメージです。

ここでよく使われるオプションが、allow_addallow_deleteです。これは、フォームフィールドを追加してよいか、削除してよいかを指定する設定です。

紙の書類でたとえると、「追加入力欄を増やしていいよ」「不要な欄は消していいよ」という許可を与えるイメージです。

3. CollectionTypeを使ったフォームの構造を理解しよう

3. CollectionTypeを使ったフォームの構造を理解しよう
3. CollectionTypeを使ったフォームの構造を理解しよう

Symfonyで動的フォームフィールドを使う基本パターンとして、次のような流れがあります。

  1. エンティティにリスト形式のプロパティを持たせる(例:複数メールアドレス)
  2. フォームタイプでCollectionTypeを使って複数項目を扱えるようにする
  3. 子フォームとして個別の項目のフォームを作成する
  4. JavaScriptで追加・削除ボタンを押すとHTML要素が増減する

まずはSymfonyのフォームタイプのイメージを見てみましょう。


$builder->add('emails', CollectionType::class, [
    'entry_type' => EmailType::class,
    'allow_add' => true,
    'allow_delete' => true,
    'prototype' => true,
]);

これは、emailsというプロパティの中に、複数のメールアドレス入力欄を追加できるフォームを作る例です。entry_typeは、Collection内に並ぶ個々の入力欄の型(種類)を表しています。

動的追加を実現するために重要なのは、prototypeという設定です。これは、JavaScriptで新しい入力欄を追加するときに使う「ひな形」を作る仕組みです。紙の世界でたとえると、コピー機がつくる「白紙のテンプレート」を1枚準備しておくようなものです。

4. Twigテンプレートで動的追加ボタンを作成しよう

4. Twigテンプレートで動的追加ボタンを作成しよう
4. Twigテンプレートで動的追加ボタンを作成しよう

Symfonyのフォーム処理では、Twigを使ってフォームを描画します。動的な追加・削除にはJavaScriptが必要ですが、Twig側にも「追加ボタン」「削除ボタン」を設置しておく必要があります。


<div id="email-fields">
    {{ form_widget(form.emails) }}
</div>
<button type="button" id="add-email-btn" class="btn btn-primary">メールアドレスを追加</button>

このようにしてボタンを用意すると、JavaScript側でクリックイベントを拾って、新しい項目をフォームに追加できるようになります。

フォームの削除ボタンについても、各入力欄の横に削除用のボタンを表示しておき、クリックするとその欄を消す仕組みを作れます。

5. JavaScriptで入力欄を追加・削除する仕組み

5. JavaScriptで入力欄を追加・削除する仕組み
5. JavaScriptで入力欄を追加・削除する仕組み

動的フォームを完成させるためには、JavaScriptでHTML要素を動的に追加していく必要があります。Symfonyでは、data-prototypeという仕組みを利用します。これは、フォームが持つ「新しい項目のテンプレートHTML」です。


<script>
const container = document.getElementById('email-fields');
const addButton = document.getElementById('add-email-btn');

let index = container.children.length;

addButton.addEventListener('click', () => {
    const prototype = container.dataset.prototype;
    const newForm = prototype.replace(/__name__/g, index);
    index++;

    const div = document.createElement('div');
    div.innerHTML = newForm;
    container.appendChild(div);
});
</script>

このJavaScriptでは、Symfonyが用意するテンプレートを使って、新しい入力欄が画面に追加されるようになっています。削除ボタンをつけたい場合は、追加されるHTMLの中にボタンを含めておき、クリック時にその要素を削除するようにします。

この仕組みによって「Symfony フォーム 動的追加」「Symfony CollectionType JavaScript」「Symfony フォーム フィールド 削除」といった検索キーワードの操作が実現できるようになります。

6. 動的フォームでつまずきやすいポイント

6. 動的フォームでつまずきやすいポイント
6. 動的フォームでつまずきやすいポイント

初心者がよくつまずくポイントをまとめておきます。

6-1. prototypeを有効にしていない

ひな形がないため、JavaScriptで追加ができない状態になります。CollectionTypeでは必ずprototypeを有効にしましょう。

6-2. allow_addallow_deleteを設定していない

これらを設定していないと、Symfonyは新しい項目の追加や削除を許可しません。

6-3. HTML構造とJavaScriptの連携がうまくいっていない

JavaScript側のIDやクラス名がTwigテンプレートと一致していないと動かなくなります。動的フォームが動かないときは、ボタンやコンテナのIDを確認しましょう。

Symfonyのフォーム処理は慣れれば強力で、入力欄の増減を自由にコントロールできます。紙のアンケートにたとえつつ、動的フォームの仕組みを理解していくと、より自然に操作できるようになります。

関連記事:
カテゴリの一覧へ
新着記事
New1
Laravel
Laravelの認証状態をチェックする方法を完全解説!authとAuth::check()を初心者向けにやさしく説明
New2
CodeIgniter
CodeIgniterのコントローラクラスの作り方を完全ガイド!初心者でもわかる基礎から実践まで
New3
Symfony
Symfonyのフォームラベルを多言語対応!初心者でもわかる翻訳設定ガイド
New4
Laravel
Laravelでユーザー登録機能を作る方法!初心者向けにバリデーションとリダイレクトをやさしく解説
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelのデータベース設定方法を完全ガイド!初心者でもわかる.envファイルの使い方
No.2
Java&Spring記事人気No2
Laravel
Laravelのビューとは?Bladeテンプレートの基本を解説
No.3
Java&Spring記事人気No3
Laravel
Laravelでセッションを扱う方法!保存方法と利用例を解説
No.4
Java&Spring記事人気No4
Laravel
Laravelのルート一覧を確認する方法!初心者でもわかるphp artisan route:listの使い方
No.5
Java&Spring記事人気No5
Laravel
Laravelでルーティングを設定する方法!web.phpと基本ルートの書き方を初心者向けに徹底解説
No.6
Java&Spring記事人気No6
Laravel
LaravelでルートをBladeテンプレートに記述する方法(route関数)
No.7
Java&Spring記事人気No7
Laravel
Laravelでログを出力する方法(Monolog・storage/logs)
No.8
Java&Spring記事人気No8
Laravel
Laravelのルートキャッシュ機能を活用してパフォーマンス改善!初心者でもわかる完全ガイド