如何注入Symfony表单扩展



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

Symfony中已有的例子有:

SymfonyBridgeDoctrineFormDoctrineOrmExtension 
SymfonyComponentFormExtensionHttpFoundationHttpFoundationExtension

根据这一点,唯一可用的标签是:

form.type
form.type_extension
form.type_guesser

不存在我需要的form.extension

的确,symfony2中没有表单扩展标记,这些扩展甚至没有在容器中注册为使用标记或事件的服务。(实际上它们甚至没有被使用…)

只需注册一个标记为form.type_extension的服务,并在buildForm()方法中将您的扩展添加到生成器中。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->addExtension(new YourWhateverExtension());
}

这就是手动添加和注册它们的方式。

use SymfonyComponentHttpFoundationSessionSession;
use SymfonyComponentFormExtensionHttpFoundationHttpFoundationExtension;
use SymfonyComponentFormExtensionCsrfCsrfExtension;
use SymfonyComponentFormExtensionCsrfCsrfProviderSessionCsrfProvider;
$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.registration服务

    <!-- 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>

提示:

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

使用列出所有标签

app/console container:debug --tags

使用搜索特定标签

app/console container:debug --tag=form.type_guesser --show-private

最新更新