Yav*_*vin 2 forms configuration symfony
我想扩展Symfony表单.这不是Symfony Type扩展.如何在symfony配置中注册我的自定义扩展(可能是一项服务?)
Symfony中已有的例子有:
Symfony\Bridge\Doctrine\Form\DoctrineOrmExtension
Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension
Run Code Online (Sandbox Code Playgroud)
根据这个唯一可用的标签是:
form.type
form.type_extension
form.type_guesser
Run Code Online (Sandbox Code Playgroud)
没有form.extension我需要的
确实,symfony2中没有form.extension标记,并且这些扩展甚至没有作为使用标记或事件的服务在容器中注册.(实际上它们甚至没用过......)
只需注册一个标记为form.type_extension的服务,并将您的扩展名添加到buildForm()方法中的构建器中.
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addExtension(new YourWhateverExtension());
}
Run Code Online (Sandbox Code Playgroud)
这是他们手动注册的方式.
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();
Run Code Online (Sandbox Code Playgroud)
Symfony使用工厂服务@ form.factory.
@ form.factory声明可以在这里找到.
更深的挖掘,你会发现@ form.registry服务在这里
<!-- 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>
Run Code Online (Sandbox Code Playgroud)
小费:
您可以使用app/console container:debug2.2以来的命令在symfony2中调试容器标签- 请参阅此PR.
列出所有标签使用
app/console container:debug --tags
Run Code Online (Sandbox Code Playgroud)
使用搜索某个标签
app/console container:debug --tag=form.type_guesser --show-private
Run Code Online (Sandbox Code Playgroud)