Как создать нового пользователя FOSUserBundle программно, используя ту же проверку, что и в веб-форме? - PullRequest
0 голосов
/ 30 октября 2018

Я использую Symfony 2.8 веб-приложение, использующее FOSUserBundle для управления пользователями. Создание новых пользователей с помощью веб-формы абсолютно не проблема.

Теперь я хотел бы добавить функцию для создания новых пользователей с REST API. Конечно, отправка имени пользователя, пароля, адреса электронной почты и т. Д. На контроллер не представляет особой проблемы:

public function registerAction(Request $request) {    
    $requestJson = json_decode($request->getContent(), true); 

    $username = $requestJson[JSON_KEY_USERNAME];
    $email    = $requestJson[JSON_KEY_MAIL];
    $password = $requestJson[JSON_KEY_PASSWORD];
    ...

    $this->registerUser($username, $email, $password);

    ...
}

private function registerUser($username, $email, $password, $locale, $timezone, $currency) {
    $userManager = $this->get('fos_user.user_manager');

    $emailExist = $userManager->findUserByEmail($email);
    $userNameExists = $userManager->findUserByUsername($username);

    if ($emailExist || $userNameExists)
        return false;

    $user = $userManager->createUser();

    $user->setUsername($username);
    $user->setEmail($email);
    $user->setPlainPassword($password);
    ...

    $user->setLocked(0); 
    $user->setEnabled(0); 

    $userManager->updateUser($user);

    return true;
}

Однако это не выполняет никакой проверки вообще. Если, например, имя пользователя пусто, NotNullConstraintViolationException выбрасывается при сохранении объекта пользователя.

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

Возможно ли как-то запустить ту же самую проверку, которая используется в RegistrationForm?

1 Ответ

0 голосов
/ 30 октября 2018

Валидатор Symfony может работать самостоятельно. В контроллере вы можете использовать сервис валидатора следующим образом:

$violations = $this->get('validator')->validate($user, null, ['your_groups_here']);
// Or inject Symfony\Component\Validator\Validator\ValidatorInterface into a service.

Возвращает ConstraintViolationListInterface , вы можете зацикливаться через этот объект.

Вы можете проверить группы проверки FOSUserBundle здесь: https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/config/validation.xml

...