Как я могу отфильтровать EntityType в моей форме по ролям? - PullRequest
2 голосов
/ 09 июля 2019

Я хотел бы показать в форме SynfomyType выбранный ввод, который предлагает только пользователей с определенной ролью.

В настоящее время я пишу приложение, в котором участвуют некоторые базовые пользователи и некоторые суперпользователи, которыеотвечает за основных пользователей.

Поэтому, когда я регистрирую нового пользователя, я хочу иметь возможность назначить его назначенному «суперпользователю», которым будет управлять.

Но когда я пытаюсь сделать поле entityType в моем registrationType, чтобы выбрать супер-пользователя для назначения, я не знаю, как отобразить только пользователей с ROLE_MANAGER в выборе.Я только понимаю, как отобразить всех пользователей.

Все пользователи находятся в одной таблице.Я делаю различие между ними, используя только систему ролей Symfony.

Я пытался взглянуть на решение query_builder, но я не понимал, как смотреть в массивах с параметром "where" или применять иерархию ролей.в этом запросе.

Мой formType выглядит следующим образом.Я пытаюсь отображать только пользователей с ROLE_MANAGER и выше в их ролях в «менеджере» входного объекта entityType.

Роли хранятся в таких массивах, как это: ["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 ]

1 голос
/ 09 июля 2019

Я полагаю, что пользовательские роли хранятся в строковом массиве, что затрудняет запрос с чем-то вроде ==. Однако вы можете использовать оператор LIKE. Это будет искать шаблон. В вашем случае, если вы хотите показывать пользователей только с ROLE_MANAGER, вы можете использовать:

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

Поместите это в строку выше ->orderBy('u.username', 'ASC');.

Имейте в виду: если у вас есть другие роли, содержащие ROLE_MANAGER, они также будут возвращены при использовании LIKE с % ... %. Подробнее об операторе sql LIKE можно прочитать здесь .

пс . Вы можете быть удивлены, почему я бы использовал andWhere() вместо where(). Это делается обычно, потому что where() может удалить предыдущие операторы WHERE в реальном запросе SQL, если таковые были, поэтому я стараюсь избегать этого. и используйте andWhere() вместо этого.

0 голосов
/ 10 июля 2019

Вы должны просто уточнить это в своем запросе (и избегать, насколько это возможно, использования необработанных строк в вашем коде):

//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)

Надеюсь, это помогло!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...