我对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()有人可以帮我解决这个问题吗?
谢谢!
答案 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'