4

Symfony フォーム (Silex) を名前で作成しようとしています。以下の構成を使用すると、 を呼び出すことができるはずですが$form = $app['form.factory']->createBuilder('address');、FormRegistry はこのタイプのフォームを見つけることができません。

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormTypeExtensionInterface;

class AddressType extends AbstractType implements FormTypeExtensionInterface
{
    public function getName()
    {
        return 'address';
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('addressee', 'text');
        // .. fields ..
        $builder->add('country', 'text');
    }

    public function getExtendedType()
    {
        return 'form';
    }
}

form.type.extensionsこれは、プロバイダーを使用してフォーム レジストリに追加されます。

$app['form.type.extensions'] = $app->share($app->extend('form.type.extensions', function($extensions) use ($app) {
    $extensions[] = new AddressType();

    return $extensions;
}));

この方法でフォームを作成するために他に何かする必要があるか、または別の方法がありますか?

4

4 に答える 4

4

ダイレクトを使わない理由

$app['form.factory']->createBuilder('Namespace\\Form\\Types\\Form')
于 2015-09-20T00:26:48.203 に答える
3

まず、私の下手な英語で申し訳ありません。:)

form.extensionsの代わりに を拡張する必要があると思いますform.type.extensions

このようなもの:

    $app['form.extensions'] = $app->share($app->extend('form.extensions',
                    function($extensions) use ($app) {
                        $extensions[] = new MyTypesExtension();

                        return $extensions;
                    }));

次に、クラスMyTypesExtensionは次のようになります。

use Symfony\Component\Form\AbstractExtension;

class MyTypesExtension extends AbstractExtension
{

    protected function loadTypes()
    {
        return array(
            new AddressType(),
            //Others custom types...

        );

    }

}

これで、次の方法でカスタム タイプを取得できます。

$app['form.factory']->createBuilder('address')->getForm();

楽しめ!

于 2013-09-16T11:51:03.760 に答える
0

Symfony から Silex に移行する場合、form.type.extension は誤解を招く可能性があると思います。

Symfony からフォームタイプの拡張機能を作成する方法:

  • いくつかのタイプに一般的な機能を追加したい (すべてのフィールド タイプに「ヘルプ」テキストを追加するなど)。
  • 単一のタイプに特定の機能を追加したい (「ファイル」フィールド タイプに「ダウンロード」機能を追加するなど)。

コードが示すように、Symfony に存在する FormType を追加したいのですが、Silex ではFormServiceProviderを定義せずに使用し、次の例に示すようにサービスをAbstractType使用するだけです。form.factory

あなたのapp.php

use Silex\Provider\FormServiceProvider;
$app->register(new FormServiceProvider());

コントローラー/アクションで:

$form = $app['form.factory']->createBuilder('form', $data)
    ->add('name')
    ->add('email')
    ->add('gender', 'choice', array(
        'choices' => array(1 => 'male', 2 => 'female'),
        'expanded' => true,
    ))
    ->getForm()
;
于 2013-05-14T13:58:55.840 に答える