【问题标题】:How to inject Symfony form extension?如何注入 Symfony 表单扩展?
【发布时间】:2013-06-23 19:41:21
【问题描述】:

我想扩展 Symfony 表单。这不是 Symfony Type 扩展。如何在 symfony 配置中注册我的自定义扩展(可能作为服务?)

Symfony 中已有的例子有:

Symfony\Bridge\Doctrine\Form\DoctrineOrmExtension 
Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension

根据this,只有可用的标签是:

form.type
form.type_extension
form.type_guesser

没有我需要的form.extension

【问题讨论】:

    标签: forms symfony configuration


    【解决方案1】:

    在 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
    

    【讨论】:

      猜你喜欢
      • 2013-03-31
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      相关资源
      最近更新 更多