如何使用与Web表单相同的验证以编程方式创建新的FOSUserBundle用户?

时间:2018-10-30 10:24:53

标签: symfony fosuserbundle

我正在使用Symfony 2.8运行基于FOSUserBundle的Web应用程序来管理用户。使用Web表单创建新用户绝对没有问题。

现在,我想添加一个功能,以使用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 :(得分:2)

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