Symfony4 - MakerBundle: Как найти всех пользователей по ролям? - PullRequest
0 голосов
/ 06 июня 2019

Я хотел бы получить всех администраторов среди пользователей (т.е. с ролью ROLE_ADMIN).

Роль атрибута "json", поэтому я не могу использовать "like" или "="operator.

Я реализовал управление пользователями с помощью MakerBundle в проекте symfony4 (make: user затем make: команды auth).

class User implements UserInterface
{
    /**
     * @ORM\Column(type="json")
     */
    private $roles = [];
}

class UserRepository extends ServiceEntityRepository
{
    public function findByRole($role){
        return  $this->createQueryBuilder('u')
            ->where("u.roles like :role  ")
            ->setParameter('role', '%'.$role.'%')
            ->getQuery()
            ->getResult();
    }
}

class MyController extends AbstractController
{
    public function edit(UserRepository $userRepository): Response
    {
        $admins = $userRepository->findByRole('ROLE_ADMIN');
        dump($admins);
        exit;
    }
}

Когда я вызываю findByRole('ROLE_ADMIN') в контроллере,сообщение об ошибке:

SQLSTATE[42883]: Undefined function: 7 ERREUR: l'opérateur n'existe pas : json ~~ unknown
LINE 1: ...AS reset_token_5 FROM itibr_user i0_ WHERE i0_.roles LIKE $1

Я также пытался использовать функции scienta / doctrine-json (https://packagist.org/packages/scienta/doctrine-json-functions),, но не смог это исправить.

1 Ответ

0 голосов
/ 12 июня 2019

Решение, которое я нашел, основано на https://www.remipoignon.fr/symfony-comment-verifier-le-role-dun-utilisateur-en-respectant-la-hierarchie-des-roles/ (извините, это французская статья)

Я создал GrantedService и затем в моем контроллере:

public function edit(UserRepository $userRepository){
        foreach($userRepository->findAll() as $user){
            if( $grantedService->isGranted($user, 'ROLE_ADMIN') ){
                //do something...
            }
        }
}

Для моего текущего проекта с очень небольшим количеством пользователей все в порядке. Но у меня есть другие проекты с тысячами пользователей, я знаю, что findAll (), тогда тестирование всех, не является хорошей практикой. Поэтому мне придется исправить эту проблему позже

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