我想扩展Symfony表单。这不是Symfony 类型扩展名。如何在symfony配置中注册我的自定义扩展(可能是服务?)
Symfony中已有的例子是:
Symfony\Bridge\Doctrine\Form\DoctrineOrmExtension
Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension
根据this,只有可用的标签是:
form.type
form.type_extension
form.type_guesser
我不需要form.extension
答案 0 :(得分:6)
symfony2中没有 form.extension 标记,并且这些扩展甚至没有在容器中注册为使用标记或事件的服务。 (实际上它们甚至没有用过......)
只需注册标记为 form.type_extension 的服务,然后使用buildForm()
方法将您的扩展程序添加到构建器中。
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addExtension(new YourWhateverExtension());
}
这是他们手动注册的方式。
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension;
use Symfony\Component\Form\Extension\Csrf\CsrfExtension;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\SessionCsrfProvider;
$session = new Session();
$secret = 'V8a5Z97e...';
$formFactory = Forms::createFormFactoryBuilder()
->addExtension(new HttpFoundationExtension())
->addExtension(new CsrfExtension(new SessionCsrfProvider($session, $secret)))
->getFormFactory();
Symfony使用工厂服务 @ form.factory 。
可以找到@ form.factory声明here。
深入挖掘你会发现 @ form.registry 服务here
<!-- 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>
提示强>
您可以使用app/console container:debug
命令在symfony2中调试容器标记,自2.2起 - 请参阅this PR。
使用
列出所有代码app/console container:debug --tags
使用
搜索特定代码app/console container:debug --tag=form.type_guesser --show-private