我正在寻找在表单中创建/添加动态选项的最佳方法。选项,我的意思是选择值对,甚至可能是默认值。我可以看到至少三个选项:
1)添加$options
表单类型时将选项添加到数组中。为此,看来我必须首先声明一个默认值,然后将它们添加到add
方法和控制器中:
控制器:
$choices = [];
foreach ($pages as $page) {
$choices[$page->getId()] = $page->getTitle();
}
$options = ['pages' => $choices];
$form = $this->createForm('MyBundle\Form\Type\PageType', $data, $options);
表格类型:
class PageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('pid', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', [
'choices' => $options['pages'],
'label' => __('Page')
]);
}
...
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'pages' => []
]);
}
}
2)如果值不依赖于控制器值,似乎我可以在OptionsResolver
(假设访问源数据)中创建它们
表格类型:
class PageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('pid', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', [
'choices' => $options['pages'],
'label' => __('Page')
]);
}
...
public function configureOptions(OptionsResolver $resolver)
{
$choices = [];
$pages = $this->getPages();
foreach ($pages as $page) {
$choices[$page->getId()] = $page->getTitle();
}
$resolver->setDefaults([
'pages' => $choices
]);
}
3)最后,我还可以在buildForm
方法中添加(再次假设访问源数据):
表格类型:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$choices = [];
$pages = $this->getPages();
foreach ($pages as $page) {
$choices[$page->getId()] = $page->getTitle();
}
$builder
->add('pid', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', [
'choices' => $choices,
'label' => __('Page')
]);
}
显然,第一个选项具有最大的灵活性,但是如果我不需要那种灵活性,或者由于某种原因不想管理控制器中的选项,那么在buildForm
orconfigureOptions
方法中进行工作是否更有意义?