如何使用与 Web 表单相同的验证以编程方式创建新的 FOSUserBundle 用户?
How to create a new FOSUserBundle user programatically using the same validation as on web form?
我正在 运行使用 FOSUserBundle
来管理基于 Symfony 2.8
的网络应用程序来管理用户。使用 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 使用的完全相同的验证?
Symfony 验证器可以独立工作。在控制器中,您可以像这样使用验证器服务:
$violations = $this->get('validator')->validate($user, null, ['your_groups_here']);
// Or inject Symfony\Component\Validator\Validator\ValidatorInterface into a service.
它会return一个ConstraintViolationListInterface,你可以循环遍历这个对象。
您可以在此处检查 FOSUserBundle 验证组:https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/config/validation.xml
我正在 运行使用 FOSUserBundle
来管理基于 Symfony 2.8
的网络应用程序来管理用户。使用 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 使用的完全相同的验证?
Symfony 验证器可以独立工作。在控制器中,您可以像这样使用验证器服务:
$violations = $this->get('validator')->validate($user, null, ['your_groups_here']);
// Or inject Symfony\Component\Validator\Validator\ValidatorInterface into a service.
它会return一个ConstraintViolationListInterface,你可以循环遍历这个对象。
您可以在此处检查 FOSUserBundle 验证组:https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/config/validation.xml