php 为什么在Symfony 6.3中尝试指定Choice Constraint的回调时会出现错误?

n3schb8v  于 2023-06-21  发布在  PHP
关注(0)|答案(3)|浏览(91)

我试图在我的一个表单中添加一个选择约束。
下面是我的一个领域。我有一个实体,持有一些角色,我希望能够选择多个角色在我的形式。我想为我所有的字段添加约束,并决定在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参数声明它只需要一个字符串或可调用的,那么是文档错了还是我遗漏了什么?
另外,我如何添加此约束?

kqqjbcuj

kqqjbcuj1#

我不认为这是一个symfony问题。问题是php在这里很棘手。
看看这个输出:

class Test
{
    public function a() {

    }

    public static function b() {

    }
}

var_dump(is_callable([Test::class, 'a'])); // false
var_dump(is_callable([Test::class, 'b'])); // true

如果一个数组包含两个字符串,则该数组是可调用的。第一个是类,第二个必须是静态函数。
所以getPersonalRoles应该是静态的!

pw9qyyiw

pw9qyyiw2#

使用UserAdminRole::getPersonalRoles(...)而不是[UserAdminRole::class, 'getPersonalRoles']不能完成这项工作吗?它会促使您将方法设置为静态的,这可能正是您在这里想要的。

wa7juj8i

wa7juj8i3#

我相信您混淆了文档中提到的概念
如果回调在不同的类中定义并且是静态的,例如App\Entity\Genre,则可以将类名和方法作为数组传递
如果考虑到上面的场景,首先你的方法必须是静态的,其次

$metadata->addPropertyConstraint('genre', new Assert\Choice([
        'callback' => [Genre::class, 'getGenres'],
    ]));

正如代码中提到的,如果你试图在Choice中以数组的形式调用callback,那么你必须使用类似于数组的方式,在你的情况下,它可能是

new Assert\Choice([
          callback => [UserAdminRole::class, 'getPersonalRoles'],
        ])

我建议你再看一遍文档
https://symfony.com/doc/current/reference/constraints/Choice.html#choices

'constraints' => [
    new Choice([
        'callback' => [UserAdminRole::class, 'getPersonalRoles'],
    ]),

相关问题