Symfony. Как проверить, не занят ли логин у юзера?

Здравствуйте, хочу разобраться в одном вопросе на примере следующего кода. Есть у меня контроллер в котором происходит создание пользователя:
/**
     * @Route("/users", name="user_create", methods={"POST"})
     */
    public function createUser(Request $request)
    {
        $login = $request->get('login');
        $password = $request->get('password');
        $user = new User();
        $user->setLogin($login);
        $user->setPassword($password);
        
        $entityManager = $this->getDoctrine()->getManager();    
        $entityManager->persist($user);
        $entityManager->flush();
        $user_id = $user->getId();
        return $user_id;
    }

Здесь User() - это стандартный entity.

Мне нужно проверять, занят ли данный логин или нет, и проверять это нужно при создании юзера и при редактировании(юзер может менять логин, вот такая хотелка). Т е совершенно логично запихнуть проверку в setLogin()
Но как это сделать? Как в entity получить доступ к бд?
Я так понимаю, если этого нельзя сделать стандартными средствами без пляски с бубном - значит я делаю говнокод.
А как по другому, может проверять в контроллере? Тогда при редактировании юзера придется копипастить кусок кода...

Хотелось бы сделать как то так:
namespace App\Entity;
class User
{
     /**
     * @ORM\Column(type="string", length=100)
     */
    private $login;

    /**
     * @ORM\Column(type="string", length=100)
     */
    private $password;

    public function setLogin(string $login): self
    {
        $user = MagicGetDoctrine()->getRepository(User::class)->findByLogin($login);
        if ($user) {
            if ($this->id != $user->getId()) {
                throw new Exceptions\UserLoginIsBusyException();
            }
        }
        $this->login = $login;
        return $this;
    }
}


Как бы вы эту проверку сделали?
  • Вопрос задан
  • 149 просмотров
Решения вопроса 1
Пригласить эксперта
Ответы на вопрос 1
@iAdil
Просто добавь Unique

/**
 * @ORM\Entity
 * @UniqueEntity("login")
 */
class User
{


Как в entity получить доступ к бд?

На будущее, если надо не просто уникальность, а какое-то другое условие использовать, создавай Validation Constraints
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы