我想扩展Symfony表单。这不是Symfony类型扩展。如何在symfony配置中注册我的自定义扩展(可能作为服务?)
Symfony中已有的例子有:
SymfonyBridgeDoctrineFormDoctrineOrmExtension
SymfonyComponentFormExtensionHttpFoundationHttpFoundationExtension
根据这一点,唯一可用的标签是:
form.type
form.type_extension
form.type_guesser
不存在我需要的form.extension
的确,symfony2中没有表单扩展标记,这些扩展甚至没有在容器中注册为使用标记或事件的服务。(实际上它们甚至没有被使用…)
只需注册一个标记为form.type_extension的服务,并在buildForm()
方法中将您的扩展添加到生成器中。
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addExtension(new YourWhateverExtension());
}
这就是手动添加和注册它们的方式。
use SymfonyComponentHttpFoundationSessionSession;
use SymfonyComponentFormExtensionHttpFoundationHttpFoundationExtension;
use SymfonyComponentFormExtensionCsrfCsrfExtension;
use SymfonyComponentFormExtensionCsrfCsrfProviderSessionCsrfProvider;
$session = new Session();
$secret = 'V8a5Z97e...';
$formFactory = Forms::createFormFactoryBuilder()
->addExtension(new HttpFoundationExtension())
->addExtension(new CsrfExtension(new SessionCsrfProvider($session, $secret)))
->getFormFactory();
Symfony使用工厂服务@form.factory.
@form.factory声明可在此处找到。
深入挖掘,您将在此处找到@form.registration服务
<!-- FormRegistry -->
<service id="form.registry" class="%form.registry.class%">
<argument type="collection">
<!--
We don't need to be able to add more extensions.
* more types can be registered with the form.type tag
* more type extensions can be registered with the form.type_extension tag
* more type_guessers can be registered with the form.type.type_guesser tag
-->
<argument type="service" id="form.extension" />
</argument>
<argument type="service" id="form.resolved_type_factory" />
</service>
提示:
从2.2开始,您可以使用app/console container:debug
命令调试symfony2中的容器标记-请参阅此PR
使用列出所有标签
app/console container:debug --tags
使用搜索特定标签
app/console container:debug --tag=form.type_guesser --show-private