【发布时间】:2014-03-26 21:18:22
【问题描述】:
根据 Symfony 文档中的 this article,我创建了一个自定义字段类型,在 services.yml 中设置它,我可以成功使用它。
例如,我创建了一个名为customdate 的自定义字段,如下所示,效果很好:
# src/Acme/DemoBundle/Resources/config/services.yml
services:
acme_demo.form.type.date:
class: Acme\DemoBundle\Form\Type\DateType
tags:
- { name: form.type, alias: customdate }
但是,如果我尝试将自定义字段命名为 date(与 an existing Symfony field type 相同,因为这是我要覆盖的内容),如下所示,那么 Symfony 将完全忽略我的自定义字段,并默认使用内置的 Symfony date 字段类型:
# src/Acme/DemoBundle/Resources/config/services.yml
services:
acme_demo.form.type.date:
class: Acme\DemoBundle\Form\Type\DateType
tags:
- { name: form.type, alias: date }
我检查了我的 getName() 函数返回的名称是否正确,与我在 services.yml 中提供的别名匹配。
我使用上述服务的代码如下。
这行得通:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('date', 'customdate')));
}
这不起作用:(或者更确切地说,Symfony 使用内置字段类型而不是我的)
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('date', 'date')));
}
我应该注意,如果我将“customdate”或“date”替换为手动创建的对象,例如new Date(),那么它可以正常工作。问题似乎特别是 Symfony 更喜欢其内置字段类型而不是 services.yml 中指定的字段类型。
我的问题:有没有办法用同名的自定义字段类型覆盖内置的 Symfony 字段类型?显然,根据我上面的描述,Symfony 似乎忽略了任何与内置 Symfony 字段类型别名相同的自定义字段。有没有办法解决这个问题?
【问题讨论】:
-
出于好奇,为什么要将它命名为相同的东西?为什么不使用自定义名称?
-
如果无法覆盖现有字段类型,则可以使用自定义名称。我喜欢将其命名为相同的原因是,从逻辑上讲,它仍然表示与内置
date字段相同类型的数据,因此不会增加认知负担记住自定义字段的名称。问题是内置的date字段类型在自定义日期格式方面有些限制,如 GitHub 上的此问题所述:github.com/symfony/symfony/issues/8345 -
据我所知,格式问题已得到修复,您尝试使用什么格式却不让您使用?
-
我需要的格式,例如,2014 年 1 月 1 日。基本上,如果使用 PHP
date()函数,则如下:date('d M Y') -
这将通过
'format'=>'d MMM Y'完成。由 IntlDateFormatter 类解析的日期。可以找到有效格式here
标签: php symfony symfony-forms