Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony forms 声明Symfony表单选项(Sym 2.8/3.0)_Symfony Forms_Symfony_Symfony 2.8 - Fatal编程技术网

Symfony forms 声明Symfony表单选项(Sym 2.8/3.0)

Symfony forms 声明Symfony表单选项(Sym 2.8/3.0),symfony-forms,symfony,symfony-2.8,Symfony Forms,Symfony,Symfony 2.8,我正在寻找在表单中创建/添加动态选项的最佳方法。所谓选项,我指的是选择值对,甚至是默认值。我至少可以看到三种选择: 1) 添加表单类型时,将选项添加到$options数组中。为此,我必须首先声明一个默认值,然后将它们添加到add方法和控制器中: $choices = []; foreach ($pages as $page) { $choices[$page->getId()] = $page->getTitle(); } $optio

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

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);
控制器:

    $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' => []
        ]);
    }
}
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
        ]);
    }
    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')
            ]);
    }
2) 如果这些值不依赖于控制器值,那么我似乎可以在
选项resolver
中创建它们(假设可以访问源数据)

表单类型:

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' => []
        ]);
    }
}
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
        ]);
    }
    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')
            ]);
    }
3) 最后,我还可以添加
buildForm
方法(再次假设访问源数据):

表单类型:

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' => []
        ]);
    }
}
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
        ]);
    }
    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
configureOptions
方法中进行工作是否更有意义?

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

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

  • 如果在多个具有不同选项的操作中使用表单:使用解决方案1,但在此选项上添加一个要求,以防止在没有选项的情况下调用表单
  • 如果您的选择通常是相同的,但您只想在某些时候覆盖它们:选择解决方案2
就我个人而言,我更喜欢解决方案1,因为如果表单依赖不太可能的外部对象(
$this->pages
,在您的示例中),它总是会更好


关于

如果您使用条令实体,您应该使用以下方法:

使用Symfony\Bridge\doctor\Form\Type\EntityType;
// ...
$builder->add('pid',EntityType::类,数组(
'class'=>'AppBundle:Page',
“选择标签”=>“标题”,
));
要使用其他类型的对象,请执行以下操作:

使用Symfony\Component\Form\Extension\Core\Type\ChoiceType;
使用AppBundle\Entity\Page;
// ...
$builder->add('pid',ChoiceType::class[
“选择”=>[
新建页面(“第1页”),
新建页面(“第2页”),
新建页面(“第3页”),
新建页面(“第4页”),
],
“选择作为值”=>true,
'choice_label'=>函数($page、$key、$index){
/**@var Page$Page*/
返回$page->getTitle();
}
]);

您可以阅读更多信息。

这是一个很好的想法,但我在假设一个通用的例子,它可能或可能不使用实体作为数据源。我也同意解决方案1是最优的,3是最简单的,但是需要外部依赖性(因此可能是服务定义)。这并不好,因为表单只是偶尔使用,在其他实例中没有重用。