1

我正在寻找在表单中创建/添加动态选项的最佳方法。选项,我的意思是选择值对,甚至可能是默认值。我可以看到至少三个选项:

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')
            ]);
    }

显然,第一个选项具有最大的灵活性,但是如果我不需要那种灵活性,或者由于某种原因不想管理控制器中的选项,那么在buildFormorconfigureOptions方法中进行工作是否更有意义?

4

2 回答 2

2

如果您需要灵活性,则不能使用解决方案 3。但如果您想避免灵活性,解决方案 3 是最好的。

解决方案 1 和 2 都可以,这取决于您的需要:

  • 如果您在具有不同选择的多个操作中使用表单:使用解决方案 1,但在此选项上添加要求以防止在没有选择的情况下调用表单
  • 如果您的选择通常相同,但您只想偶尔覆盖它们:选择解决方案 2

我个人更喜欢解决方案 1,因为如果您的表单依赖于不太可能的外部对象($this->pages在您的示例中),它总是会更好。

问候

于 2016-01-28T00:54:06.310 回答
1

如果你使用 Doctrine Entity,你应该使用这个:

use Symfony\Bridge\Doctrine\Form\Type\EntityType;
// ...

$builder->add('pid', EntityType::class, array(
    'class' => 'AppBundle:Page',
    'choice_label' => 'title',
));

对于使用另一种类型的对象:

use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use AppBundle\Entity\Page;
// ...

$builder->add('pid', ChoiceType::class, [
    'choices' => [
        new Page('Page 1'),
        new Page('Page 2'),
        new Page('Page 3'),
        new Page('Page 4'),
    ],
    'choices_as_values' => true,
    'choice_label' => function($page, $key, $index) {
        /** @var Page $page */
        return $page->getTitle();
    }
]);

您可以在此处的博客文章中阅读更多信息。

于 2016-01-28T11:56:13.240 回答