在Symfony中创建自定义字段时,我们定义了一种方法 getParent
我们通过从 AbstractType 类扩展来定义我们的类,然后使用 getParent 方法返回父类型。而不是从父类扩展。
我想知道这种方法背后的哲学。
是否可以定义我的自定义类型:
class ImageType extends FileType
{
public function getName()
{
return 'image';
}
}
而不是:
class ImageType extends AbstractType
{
public function getParent()
{
return 'file';
}
public function getName()
{
return 'image';
}
}
如果能,那么这两种方法有什么区别?
谢谢!
答案 0 :(得分:7)
主要有两点不同:
第一个是关于FormTypeExtension
s。这些扩展修改了某些表单类型(例如:它们可以更改/添加一些默认选项,甚至可以添加字段)
使用第一种方法(例如继承),FileType
类型的所有扩展名将应用于ImageType
,但使用第二种方法(例如 getParent ),他们不会获胜,因此您可以更好地控制您的结构。
第二个区别是使用buildForm
和buildView
修改子表单中父表单的行为。
使用第一种方法(例如继承),覆盖基类的方法(如果您在子级中提供它们),但第二种方法(例如 getParent) )将孩子的逻辑添加到父母的逻辑。
请考虑以下示例:
// FileType
public function buildForm(FormBuilderInterface $builder, array $options){
$builder->add('name', 'text');
}
// ImageType
public function buildForm(FormBuilderInterface $builder, array $options){
$builder->add('email', 'email');
}
表单字段:[名称] [电子邮件]
表单字段:[电子邮件]
答案 1 :(得分:0)
不,您需要使用AbstractType进行扩展。这用于显示和构建表单,而不是您正在扩展的简单实体。在您的情况下,基本类型FileType与具有特定方法的文件相关,您将被允许轻松覆盖它们,但可以通过AbstractType扩展并添加新字段。如果扩展了FileType,我认为Symfony2不会正确加载任何新函数。
我认为第一种方法更紧凑并且想要使用它,但我认为如果你调整buildView或setDefaultOptions,或者添加另一种不属于基类型的方法,这会导致问题。