Symfony 表单公共字段 inheritance/composition
Symfony form common fields inheritance/composition
我有 2 个共享公共字段的实体 A
和 B
,我使用 trait
基于 () 设置这些公共字段,因为我不不想使用 MappedSuperClass
.
为实体 B
设置 restful post 路由,我实例化 FormBType
,data_class
映射到 B::class
,即extends FormCType
(包含公共字段和“data_class
”映射为空)。
我尝试将 inherit_data 方法与 https://symfony.com/doc/current/form/inherit_data_option.html 一起使用,但我不想在我的表单中使用额外的 key/nested 层(我想要一个扁平的层)。
我的问题是未考虑使用 Assert 对特征中的公共字段进行验证,并且表单通过 validation
为空字符串。
class B {
use CTrait;
}
//trait that has the common fields with ORM mapping and Assert
trait CTrait {
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string")
* @ORM\Assert\Length(min="2")
*/
private $name;
}
//Common fields formType
class CType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name');
}
}
//Form using the common fields formType
class BType extends CType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => B::class,
'csrf_protection' => false,
]);
}
}
我有 2 个共享公共字段的实体 A
和 B
,我使用 trait
基于 (MappedSuperClass
.
为实体 B
设置 restful post 路由,我实例化 FormBType
,data_class
映射到 B::class
,即extends FormCType
(包含公共字段和“data_class
”映射为空)。
我尝试将 inherit_data 方法与 https://symfony.com/doc/current/form/inherit_data_option.html 一起使用,但我不想在我的表单中使用额外的 key/nested 层(我想要一个扁平的层)。
我的问题是未考虑使用 Assert 对特征中的公共字段进行验证,并且表单通过 validation
为空字符串。
class B {
use CTrait;
}
//trait that has the common fields with ORM mapping and Assert
trait CTrait {
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string")
* @ORM\Assert\Length(min="2")
*/
private $name;
}
//Common fields formType
class CType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name');
}
}
//Form using the common fields formType
class BType extends CType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => B::class,
'csrf_protection' => false,
]);
}
}