2

選択タイプの要素を持つフォームがあります。データを入力する必要があります。私が知っているように、3つの方法があります。

1.コントローラー:

// Controller
public function myAction()
{
      $choices = ...; // create choices array
      $form = $this->createForm(new MyFormType($dm), null, array(
            'choices' => $choices,
        ));
}

// Form
class MyFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('cars', 'choice', array(
                'choices' => $options['choices']
        ));
    }
}

2.フォームクラス+リポジトリ

// Controller
public function myAction()
{
      $dm = $this->get('doctrine')->getManager();
      $form = $this->createForm(new MyFormType($dm));
}

// Form
class MyFormType extends AbstractType
{
    private $dm;

    public function __construct($dm) 
    {
        $this->dm = $dm;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('cars', 'choice', array(
                'choices' => $options['choices']
        ));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $list = array();
        foreach($this->dm->getRepository('MyBundle:Cars')->findAll() as $car) {
            $list[$car->getName()] = $car->getName();
        }

        $resolver->setDefaults(array(
            'choices'        => $list,
        ));
    }
}

3.フォームクラス+カスタムサービス

// Controller
public function myAction()
{
      $dm = $this->get('doctrine')->getManager();
      $form = $this->createForm(new MyFormType(), null, array(
            'myservice' => $this->get('myservice'),
        ));
}

// Form
class MyFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('cars', 'choice', array(
                'choices' => $options['myservice']->getCars()
        ));
    }
}

// Service
class MyService
{
    const ENTITY_CAR = 'MyBundle:Cars';

    /** @var DocumentManager */
    private $dm;

    public function __construct(DocumentManager $dm)
    {
        $this->dm = $dm;
    }

    public function getCars()
    {
        return $this->dm->getRepository("MyBundle:Cars")->findAll();
    }
}

私の考えを述べます。

最初のオプションはベスト プラクティスではありません。特に複雑なロジックが関係している場合。コントローラーはできるだけ小さくする必要があります。

2番目ははるかに優れています。ただし、エンティティ名が公開され、名前を変更すると問題が発生する可能性があります。

3番目が最良のオプションです。エンティティ名が 1 か所に集中し、IDE タイプのヒントが改善され、エンティティの集中管理 (検索、保存、削除...) が行われます。主な欠点は、多くの読み取り/書き込み操作を担当するようになるため、クラスが過剰に設計される可能性があることです。一方、それは断片に分割することができます。

あなたはそれについてどう思いますか?

4

2 に答える 2

2

3 番目のオプションは、そのサービスをコードの他の場所で再利用する必要がある場合に適しています (また、作成したサービスと比較してそのサービスが成長する場合は、後で説明します)。そのように、あなたが言ったように、そのエンティティの「マネージャー」は1つであり、レポの名前、constなどを含みます。

しかし

このサービスが、名前を隠してリポジトリにアクセスするための「プッシャー」としてのみ使用されている場合、このソリューションは見た目ほど優れているとは思えません。
明らかに、そのサービスに複数の永続化オプションと複数の取得オプション (選択した ORM に基づく) があると考えられる場合、その場合、これがベスト プラクティスになる可能性があります。

それ以外の場合は、常に 2 番目の方が優れていると思います。

すべての優れた慣行を無視したい場合を除き、最初の方法は実用的ではありません

于 2012-12-28T09:18:28.747 に答える
1

4番目の解決策を提案します:entityDBからロードされたオプションを持つ選択フィールドとして設計されているため、フィールドを使用してください!

これが公式ドキュメントですhttp://symfony.com/doc/master/reference/forms/types/entity.html

そして、あなたはそれをどのように使うことができますか:

// Form
class MyFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('cars', 'entity', array(
            'class' => 'MyBundle:Cars',
            'property' => 'name',
            //Optionnal if you need to condition the selection
            'query_builder' => function(EntityRepository $er) {
                return $er->createQueryBuilder('u')->orderBy('u.username', 'ASC');
            },
        ));
    }
}
于 2012-12-28T11:12:36.267 に答える