2

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

Symfony 中已有的例子有:

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

据此,唯一可用的标签是:

form.type
form.type_extension
form.type_guesser

没有form.extension我需要的

4

1 回答 1

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 声明可以在这里找到。

深入挖掘,您会在这里找到@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>

提示:

app/console container:debug从 2.2 开始,您可以使用命令在 symfony2 中调试容器标签- 请参阅此 PR

列出所有标签使用

app/console container:debug --tags

使用搜索特定标签

app/console container:debug --tag=form.type_guesser --show-private
于 2013-06-23T19:51:42.610 回答