シナリオ: 2 つの選択があるフォームがあります。ユーザーが最初の選択から何かを選択すると、2 番目の選択に新しい値が入力されます。この部分は正常に動作します。
ただし、初期フォームでは許可されていない選択肢がいくつか含まれているため、フォームは検証されません。
形:
<?php
class MyType extends AbstractType
{
private $category;
public function __construct($category = null)
{
$this->category = $category;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('category', 'choice', array(
'choices' => array(
'foo' => 'foo',
'bar' => 'bar'
)
);
$builder->add('template', 'choice', array(
'choices' => $this->loadChoices()
);
}
private function loadChoices()
{
// load them from DB depending on the $this->category
}
}
最初のカテゴリはfoo
です。したがって、foo のテンプレートが読み込まれ、選択肢として設定されます。しかし、ユーザーが を選択bar
すると、バー テンプレートが読み込まれます。しかし、フォームにはまだ foo の選択肢があり、検証されません。
これを解決する最善の方法は何ですか?
私が見つけた 1 つの方法は、コントローラーでフォームを再起動することでした。
<?php
$form = $this->createForm(new MyType());
if ($request->getMethod() === 'POST') {
if ($request->request->has($form->getName())
&& isset($request->request->get($form->getName())['category'])) {
$form = $this->createForm(new MyType($request->request->get($form->getName())['category']));
}
// ...
}
IllegalArgumentException
これは機能しますが、値を設定するとスローされ、デフォルトを想定しているため、テストできません。これに対するより良い解決策はありますか?前もって感謝します!