選択タイプの要素を持つフォームがあります。データを入力する必要があります。私が知っているように、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 タイプのヒントが改善され、エンティティの集中管理 (検索、保存、削除...) が行われます。主な欠点は、多くの読み取り/書き込み操作を担当するようになるため、クラスが過剰に設計される可能性があることです。一方、それは断片に分割することができます。
あなたはそれについてどう思いますか?