如何使用角色过滤表单中的EntityType?

时间:2019-07-09 16:32:05

标签: symfony4

我想以Synfomy形式显示一个选择输入,该选择输入仅建议具有特定角色的用户。

我目前正在编写一个应用程序,其中涉及一些基本用户和一些负责基本用户的超级用户。

因此,每当我注册一个新用户时,我都希望能够将其分配给指定的“超级用户”,由该超级用户管理。

但是,当我尝试在我的registrationType中创建一个实体类型字段以选择要分配的超级用户时,我不知道如何仅显示具有ROLE_MANAGER选项的用户。我只了解如何显示所有用户。

所有用户都在同一表中。 我仅使用Symfony角色系统来区分它们。

我试图查看一个query_builder解决方案,但是我并没有了解如何使用“ where”参数查找数组或在该查询中应用角色层次结构。

我的formType如下。 我试图仅在“ manager” entityType select输入中显示角色为ROLE_MANAGER和更高级别的用户。

角色存储在这样的数组中:[“ ROLE_USER”,“ ROLE_MANAGER”,“ ROLE_ADMIN”] ...因此,user.roles返回此类数组。


class RegistrationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder
            ->add('email')
            ->add('username')
            ->add('manager', EntityType::class,[
                'class' => User::class,
                'choice_label' => 'username',
                'query_builder' => function (EntityRepository $er){
                    return $er->createQueryBuilder('u')
                        ->orderBy('u.username', 'ASC');
                }])
            ->add('password',PasswordType::class)
            ->add('confirm_password',PasswordType::class)
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => User::class,
            'validation_groups' => ['Default', 'registration'],
        ]);
    }
}

有人能指出我正确的方向吗?

非常感谢!

2 个答案:

答案 0 :(得分:1)

我认为用户角色存储在字符串数组中,这使得使用==之类的查询变得更加困难。但是,您可以使用LIKE运算符。这将寻找一个模式。在您的情况下,如果您只想向用户显示ROLE_MANAGER,则可以使用:

 ->andWhere('u.roles LIKE \'%ROLE_MANAGER%\' ')

将此内容放在->orderBy('u.username', 'ASC');上方的行中。

请注意::如果您还有其他包含ROLE_MANAGER的角色,则将LIKE% ... {{1} }。您可以阅读有关sql LIKE运算符here的更多信息。

ps 。您可能想知道为什么我会使用%而不是andWhere()。这是习惯性的操作,因为where()可以删除实际SQL查询中的先前where()语句(如果有的话),因此我尝试避免使用它。并改用WHERE

答案 1 :(得分:0)

您应该在查询中对其进行精确调整(并尽量避免在代码中使用原始字符串):

//somewhere in your project
class User
{
    const ROLE_MANAGER = 'ROLE_MANAGER'; //or in your config, parameters etc
}

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $role = User::ROLE_MANAGER;
        // OR something like this if you think you gonna 
        // need to reuse this formtype with other roles restructions : 
        // $role = $options["role"];

        //...
                       ->andWhere(':role IN u.roles')
                       ->setParameter('role', $role)

DQL的另一件很酷的事情是,它在标准SQL操作上添加了一些糖。 例如,在接近此用例的用例中,您可能需要使用“ MEMBER OF”关键字,使您可以搜索集合中的特定实体:

                      ->andWhere(':manager MEMBER OF u.managedBy')
                       ->setParameter('manager', $user)

希望有帮助!