2

Symfony のフォームを拡張したい。これは Symfony Type拡張ではありません。カスタム拡張機能を symfony config に登録する方法 (おそらくサービスとして?)

すでに 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:debug2.2 以降のコマンドを使用して、symfony2 のコンテナ タグをデバッグできます-この PRを参照してください。

を使用してすべてのタグを一覧表示する

app/console container:debug --tags

を使用して特定のタグを検索します

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