我试图在我的一个表单中添加一个选择约束。
下面是我的一个领域。我有一个实体,持有一些角色,我希望能够选择多个角色在我的形式。我想为我所有的字段添加约束,并决定在FormType中这样做,但我也尝试在Entity中使用Assert,我得到了同样的错误。
$builder->
->add('admin_role', EntityType::class, [
'class' => UserAdminRole::class,
'choice_label' => 'public_name',
'query_builder' => function(EntityRepository $er){
return $er->createQueryBuilder('r')
->andWhere('r.role_type = :paramRoleType')
->setParameter('paramRoleType', 'personal');
},
'multiple' => true,
'expanded' => true,
'label' => 'Functie',
'constraints' => new Choice(
callback: [UserAdminRole::class, 'getPersonalRoles'], //this line causes the error
min: 1,
// max: 1,
minMessage: $choiceMinMessage,
// maxMessage: $maxMessage,
)
]);
回调参数要求可调用|Choice Constraint类中的字符串(下图)。我传递了一个带有Entity的数组,其中我有getPersonalRoles
方法,但文档指导我定义一个数组,以防我在另一个Entity中有方法。
Choice Constraint class
Symfony Docs mentions array as available type
Symfony的文档
这是我得到的错误:
the error im getting
我试着按照文档添加了一个数组,在其中我指定了另一个实体中的回调。
callback参数声明它只需要一个字符串或可调用的,那么是文档错了还是我遗漏了什么?
另外,我如何添加此约束?
3条答案
按热度按时间kqqjbcuj1#
我不认为这是一个symfony问题。问题是php在这里很棘手。
看看这个输出:
如果一个数组包含两个字符串,则该数组是可调用的。第一个是类,第二个必须是静态函数。
所以
getPersonalRoles
应该是静态的!pw9qyyiw2#
使用
UserAdminRole::getPersonalRoles(...)
而不是[UserAdminRole::class, 'getPersonalRoles']
不能完成这项工作吗?它会促使您将方法设置为静态的,这可能正是您在这里想要的。wa7juj8i3#
我相信您混淆了文档中提到的概念
如果回调在不同的类中定义并且是静态的,例如App\Entity\Genre,则可以将类名和方法作为数组传递
如果考虑到上面的场景,首先你的方法必须是静态的,其次
正如代码中提到的,如果你试图在Choice中以数组的形式调用callback,那么你必须使用类似于数组的方式,在你的情况下,它可能是
我建议你再看一遍文档
https://symfony.com/doc/current/reference/constraints/Choice.html#choices