Symfony 2,在实体上使用ChoiceType的createFormBuilder,choice_label是int

时间:2016-09-07 19:17:44

标签: php forms symfony formbuilder

我对Symfony 2和表单构建器有一点问题。 我想基于Doctrine findAll结果创建一个ChoiceType字段。

我的选择是实体数组,但在choice_label函数中,第一个变量是int!

我放了一些代码来解释:

    $categories = $categoryRepository->findAll();

    foreach ($categories as $value) {
        echo "category name : ".$value->getName()."<br/>";
    }
    /* Result :
        category name : First
        category name : Second
     */        

    $form = $this->createFormBuilder($dance)
            ->add('name', TextType::class, array('label' => 'Nom de la dance'))
            ->add('description', TextareaType::class, array('label' => 'Description'))
            ->add('creationDate', DateTimeType::class, array('label' => 'Date de création'))
            ->add('category', ChoiceType::class, [
                'choices' => $categories,
                'choice_label' => function($category, $key, $index) {
                    var_dump($category);
                    // Result : int(0) 
                    return $category->getName();
                    // Exception !
                },
                'choice_attr' => function($category, $key, $index) {
                    return ['class' => $category->getId()];
                },
            ])
            ->add('save', SubmitType::class, array('label' => 'Sauvegarder'))
            ->getForm();

当然,我有一个致命错误:在整数...

上调用成员函数getName()

有人可以帮我解决这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

如果您使用的是比Symfony 2.7更旧的版本,则不能简单地将一组对象传递给choices选项。这仅在Symfony&gt; = 2.7中受支持。如果你想在Symfony 2.7或2.8中这样做,你必须激活choices_as_values option

'choices_as_values' => true

默认情况下,在Symfony 2.x choices中反过来构建:the keys of the array become the value and the value of they array becomes the label。因此,对于数组中的第一个元素,您将获得0。 :)

或者,您可能希望使用EntityType class代替ChoiceType。它无论如何都会将实际对象传递给函数。

此外,如果您要将实体(或引用的实体)的属性指定为标签,您还可以使用property paths

'choice_label' => 'name'