如何注入Symfony表单扩展?

时间:2013-06-23 19:41:22

标签: forms symfony configuration

我想扩展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

1 个答案:

答案 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