スポーツイベントの登録をする場合があります。
登録には、各スポーツに固有のいくつかのフィールドが含まれています。そのうちのいくつかは、スポーツごとに異なりますが、同じように名前が付けられます。例:「フィールド上のお気に入りの位置」:
バスケットボールの場合、次のいずれかの選択フィールドになります。
- ポイントガード
- シューティングガード
- 等...
野球の場合、同じ選択フィールドになりますが、いくつかの異なる選択肢があります。
- ピッチャー
- 内野
- 外野
- ..。
(表示用の)フォームを最初に作成するとき、スポーツは登録のデータの一部として渡されます。
$registration = new Registration;
$registration->setEvent($event);
そして$event->getSport();
そのイベントのためにスポーツを返すでしょう。
これまでのところ、フォームの生成にリスナーを追加すると、そのスポーツに固有のフィールドのみを設定できます。
public static function getSubscribedEvents()
{
return [FormEvents::POST_SET_DATA => 'preSetData'];
}
/**
* @param event DataEvent
*/
public function preSetData(DataEvent $event)
{
$form = $event->getForm();
if (null === $event->getData()) {
return;
}
// (The get event here means the real life sports gathering)
$sport = $event->getData()->getEvent()->getSport();
/**
* Then I customize the fields depending on the current sport
*/
}
問題は、ユーザーがこのフォームを送信し直すときに発生します。この場合、$event->getData()->getEvent()
はnull
です。
「イベント」(実際のイベント)はdocument_id
、登録フォームのフィールドです(ここではMongoDBを使用)。
::BIND
の代わりにイベントを聞くと、::PRE_SET_DATA
すべてにアクセスできますが、フォームはすでにバインドされているため、カスタマイズするには遅すぎます。::PRE_BIND
と同じことをし::PRE_SET_DATA
ます。
フォームをカスタマイズして適切に検証するために、ここでイベントとスポーツのドキュメントを正しく取得するにはどうすればよいですか?