複雑なフォームを埋め込みフォームで作成しようとしています。symfonyフォームの提出が要求配列をエンティティに変換しない
フォームは、同時に2つのエンティティ(Instrument
およびSpecification
)を作成または変更する必要があります。フォームの問題点を説明する前に
いくつかの重要な情報:
Specification
が常に同じクラスではないので、この2つのエンティティ間には教義の関係はありません。たとえば、Instrument
がギターの場合、クラスはGuitarSpecification
、レコーダーの場合はRecorderSpecification
です。
教義は関係のこのタイプを扱うことができないので、私はそれを手動で管理する:
- エンティティがロードされる
Specification
関連ゲッター/セッターを持つプロパティspecification
としてInstrument
エンティティが、中で除去し、永続しましたDoctrine Eventsを使用してInstrument
と同じ時間です。
機器のルートフォームは(ライトバージョン)である:
class InstrumentType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->setRequestHandler(new JsonApiRequestHandler());
$builder
->add('name', TextType::class)
// ... other fields
;
// Add specification
$formModifier = function(FormInterface $form, \InstrumentBundle\Entity\InstrumentType $instrumentType = null) {
$prefix = null === $instrumentType ? 'Abstract' : $instrumentType->getPrefix();
$form->add('specification', 'InstrumentBundle\\Form\\Specification\\' . $prefix . 'SpecificationType');
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function(FormEvent $event) use ($formModifier) {
// Get Instrument Entity
$data = $event->getData();
$formModifier($event->getForm(), $data->getInstrumentType());
}
);
$builder->get('instrumentType')->addEventListener(
FormEvents::POST_SUBMIT,
function(FormEvent $event) use ($formModifier) {
// Get Instrument Entity
$instrumentType = $event->getForm()->getData();
$formModifier($event->getForm()->getParent(), $instrumentType);
}
);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'csrf_protection' => false,
'cascade_validation' => true,
'data_class' => 'InstrumentBundle\Entity\Instrument'
]);
}
}
Instrument
(ギターの種類を確認し、イベントリスナー(PRE_SET_DATA
とPOST_SUBMIT
)が存在するこの形式の孤独な複雑であり、レコーダーなど)を入力し、正しいSpecification
フォーム(GuitarSpecification、RecorderSpecificationなど)を追加します。ここで
は私のSpecification
フォームタイプのうちの一つの例である:
class GuitarSpecificationType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('leftHanded', CheckboxType::class)
->add('headstock', TextType::class)
->add('body', TextType::class)
->add('amplification', TextType::class)
->add('strings', IntegerType::class)
->add('frets', IntegerType::class)
->add('tuning')
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'csrf_protection' => false,
'data_class' => 'InstrumentBundle\Entity\Specification\GuitarSpecification'
]);
}
}
フォームが送信されたときに私の問題は、Specification
依頼アレイの一部がエンティティに変換されませんされ、そしてIエラーを取得します。
私はこの問題を解決する方法を見つけることができませんので、ご了承ください。
私はテーブル継承を使用することもできましたが、私は、パフォーマンスへの影響を心配していました。 – Elorfin
あなたの '$ form-> add(' specification '、' InstrumentBundle \\ Form \\ Specification \\ '。$接頭辞、' SpecificationType '); '' '$ form-> add(' specification '、EntityType :: class、array(' class '=>' InstrumentBundle:Specification \ '$プレフィックス' 'SpecificationType' '"いいえ? – lemairep
EntityTypeは既存のエンティティを選択します。埋め込みフォームを使用して新しいものを作成/更新します。 – Elorfin