0

その場でFormTypeを作成し、新しいフォームタイプクラスを手動で作成することを回避することは可能ですか?

現在、私はこれをしなければなりません:

MyController.php

$builder = $this->createBuilder(new ParentEntity());
$builder
  ->add('parentfield1')
  ->add('parentfield2');
  ->add('children', 'collection', array('type' => new ChildType());

ChildType.php

class ChildType extends \Symfony\Component\Form\AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('childname1')
                ->add('childname2');
    }

    public function getDefaultOptions(array $options) {
        return array(
            'data_class' => 'ChildEntity',
        );
    }

    public function getName() {
        return 'childentity';
    }

}

ChildTypeクラスを手動で作成することを避け、代わりに次のようなことをしたいと思います。

MyController.php

$childBuilder = $this->createBuilder(new ChildEntity());
$childBuilder
   ->add('childfield1')
   ->add('childfield2');

// how to create FormType from builder???
$childType = $childBuilder->??????;

$builder = $this->createBuilder(new ParentEntity());
$builder
  ->add('parentfield1')
  ->add('parentfield2');
  ->add('children', 'collection', array('type' => $childType);

私はタイプを取得しようとしました:

$childBuilder->->getFormConfig()->getType(); 

しかし、それはうまくいきませんでした。エラーが発生します:

フォームのビューデータは、クラスNamespace \ Bundle \ Entity \ ChildEntityのインスタンスであることが期待されていますが、クラスDoctrine \ Common \ Collections\ArrayCollectionのインスタンスです。このエラーを回避するには、「data_class」オプションをnullに設定するか、クラスDoctrine \ Common \ Collections\ArrayCollectionのインスタンスをNamespace\Bundle \ Entity\ChildEntityのインスタンスに変換するビュートランスフォーマーを追加します。

現在私が思いついた最善の方法は、コンストラクターとしてフィールドの配列を受け入れるカスタムFormTypeを作成することですが、より良い方法はありますか?

4

0 に答える 0