起始情況
我正在嘗試使用 Symfony 6 創建一個 FormTypeExtension 來擴展我的自定義型別。
類層次結構如下:
AbstractType <-- indeed this class is abstract
--MyBaseType
| --MySubType1
| --MySubType2
--MyOtherType
我的表單型別擴展:
class TranslatableTypeExtension extends AbstractTypeExtension
{
/**
* Should apply to MyBaseType plus MySubType1 and
* MySubType2 by inheritance
*/
public static function getExtendedTypes(): iterable
{
return [
MyBaseType::class,
];
}
/**
* Special option for these custom form types
*/
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'translate_only' => false,
]);
$resolver->setDefined(['translate_only']);
}
}
我的自定義型別類:
class MyBaseType extends AbstractType
{
}
class MySubType1 extends MyBaseType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('blahblahblah', TextType::class, [
'label' => 'blahblahblah',
])
(etc.)
;
}
}
(same for MySubType2)
在我的控制器中:
class MySub1Controller extends AbstractController
{
#[Route('/MySub1/{id}/translate', name: 'app_mysub1_translate')]
public function translateMuSub1(MySub1Repository $mySub1Repository, EntityManagerInterface $entityManager, Request $request, int $id): Response
{
$mySub1 = $mySub1Repository->find($id);
$form = $this->createForm(MySubType1Type::class, $mySub1, [
'translate_only' => true,
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$mySub1 = $form->getData();
$entityManager->persist($mySub1);
$entityManager->flush();
return $this->redirectToRoute('app_mysub1', ['id' => $id]);
}
return $this->renderForm('public/form/mysub1.html.twig', [
'form' => $form,
]);
}
}
這個結果是:
An error has occurred resolving the options of the form "App\Form\Type\MySub1Type": The option "translate_only" does not exist. Defined options are: (...)
結論
此錯誤訊息意味著 FormTypeExtension 不適用于 MySubType1:選項 translate_only 未被認為是允許的。
問題
我在Symfony 表單型別擴展檔案中看到表單擴展可用于繼承 FormType的經典表單型別。但我沒有看到任何地方寫到我們不能以同樣的方式將它用于繼承 AbstractType 的客戶型別。
- 有沒有可能?
- 如果可能的話,我做錯了什么?
提前感謝您的幫助,伙計們。
uj5u.com熱心網友回復:
FormType 繼承建立在方法 getParent() 之上。可能,您不應該擴展MyBaseType而是將其回傳getParent()
getParent() 當在這里回傳一個(完全限定的)類名時,Symfony 將呼叫該型別的每個方法(即 buildForm()、buildView() 等)及其所有型別擴展,然后再呼叫您自定義的相應方法型別。
https://symfony.com/doc/current/form/create_custom_field_type.html#creating-form-types-created-from-scratch
class MyBaseType extends AbstractType
{
}
class MySubType1 extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('blahblahblah', TextType::class, [
'label' => 'blahblahblah',
])
(etc.)
;
}
public function getParent()
{
return MyBaseType::class;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/519742.html
