FormBuilderでEntityを更新する
考えないといけないこと多すぎ、マジでクソ
formBuilderの更新時
configureOptions()は必要 #?? repositoryにperisitなどする実装は必要 #?? 最小の例が欲しい
Entity
Repository
FormBuider
Controller
View
formの初期値は更新されているか
configureOptions()を指定すると、そのEntityに関するすべてのproperyに対してbuilder->add()をしないといけないか?
たぶんそうmrsekut.icon
しなくても良いがnullになる
そのEntityでの定義がnull非許容になっていてもnullになる
もちろん静的には何も行ってくれないので、ランタイムエラーになる
これでは無意味なので、実質「すべてのpropertyに足しいて、builder->add()」する必要がある
初期値を入れたいときは、typeの中で入れるのではない
Controller側で入れる
idはFormBuilderのadd()で指定する必要はない
createBuilderとcreateFormがある
割と最小に近い実装
とはいえ、「formに入力したものを新しく追加する」のか「formに入力して更新する」のかで実装は変わると思う
FormBuilder
code:php
function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('display_mark', ToggleSwitchType::class, [
'required' => false,
'mapped' => true
]);
}
function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults(
);
}
idは、書く必要はない
idなしで、configureOptions()ありでもなんかいけるらしい
意味がわからん
Controller
code:php
$FeatureInfo = $this->featureInfoRepository->findOneBy('id' => 1); $builder = $this->formFactory->createBuilder(FeatureDisplayType::class, $FeatureInfo);
$form = $builder->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$FeatureInfo = $form->getData();
$this->entityManager->persist($FeatureInfo);
$this->entityManager->flush();
}
return [
'form' => $form->createView(),
];
まずRepositoryから既存のEntityを取得する
そのEntityをcreateBuilderに渡して、builderを生成する
ここで渡さないと、submitしたときに新しくrecordが追加されてしまう
handleRequest()でformのviewからのdataを使って内容を更新する
あとは、entityManagerを使って、Entityを更新すればいい
View
{{ form_widget(form._token) }}が必要
ないとエラーになる