如何使用与web表单相同的验证程序创建新的FOSUserBundle用户



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

现在我想添加一个功能,用RESTapi创建新用户。当然,向管理员提交用户名、密码、电子邮件等并不是什么大不了的事:

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使用的验证完全相同的验证

Symfony验证器可以独立工作。在控制器中,您可以使用这样的验证器服务:

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

它将返回一个ConstraintViolationListInterface,您可以通过该对象循环。

您可以在此处查看FOSUserBundle验证组:https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/config/validation.xml

最新更新