在 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>
提示:
您可以在 symfony2 中使用 app/console container:debug 命令从 2.2 开始调试容器标签 - 请参阅 this PR。
使用
列出所有标签
app/console container:debug --tags
使用搜索某个标签
app/console container:debug --tag=form.type_guesser --show-private