在Symfony中创建自定义字段时,我们定义了一个getParent方法
我们通过从AbstractType类扩展来定义我们的类,然后使用getParent方法返回父类型.而不是从父类扩展.
我想知道这种方法背后的哲学.
是否可以定义我的自定义类型:
class ImageType extends FileType
{
public function getName()
{
return 'image';
}
}
Run Code Online (Sandbox Code Playgroud)
而不是这个:
class ImageType extends AbstractType
{
public function getParent()
{
return 'file';
}
public function getName()
{
return 'image';
}
}
Run Code Online (Sandbox Code Playgroud)
如果能,那么这两种方法有什么区别?
谢谢!
有两个主要区别:
第一个是FormTypeExtensions.这些扩展修改了某些表单类型(例如:它们可以更改/添加一些默认选项,甚至可以添加字段).
使用第一种方法(例如继承),该类型的所有扩展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');
}
Run Code Online (Sandbox Code Playgroud)
表格字段:[ 姓名 ] [ 电子邮件 ]
表格字段:[ email ]
不,您需要使用 AbstractType 进行扩展。它用于显示和构建表单,而不是您要扩展的简单实体。基本类型(在您的情况下为 FileType)与具有特定方法的文件相关,您可以轻松地覆盖它们,但通过 AbstractType 进行扩展并可以添加新字段。如果你扩展了 FileType,我认为 Symfony2 不会正确加载任何新函数。
我认为第一个方法更紧凑,并且想使用它,但我认为如果您正在调整 buildView 或 setDefaultOptions,或者添加不属于基本类型的另一个方法,这会导致问题。
| 归档时间: |
|
| 查看次数: |
3212 次 |
| 最近记录: |