Symfony使用UniqueEntity仍出现重复邮箱用户名注册SQL报错如何解决
问题原因
- UniqueEntity注解配置错误:你当前配置的
@UniqueEntity(fields={"email", "username"}, message="It looks like your already have an account!")属于组合唯一性校验,仅当新用户的邮箱、用户名同时和数据库中某条已有记录完全一致时才会触发校验报错,不符合你“邮箱和用户名各自独立唯一”的需求。 - 控制器未主动触发校验:Symfony的实体校验注解不会在持久化时自动执行,你没有使用Symfony表单组件的情况下,需要手动调用校验器服务对实体做参数校验,否则注解规则不会生效,直接刷入数据库就会触发数据库层面的唯一约束报错。
修复方案
1. 修正User实体的UniqueEntity配置
你需要定义两个独立的UniqueEntity注解,分别校验邮箱、用户名的唯一性:
/** * @ORM\Entity(repositoryClass=UserRepository::class) * 分别校验邮箱、用户名的唯一性 * @UniqueEntity(fields={"email"}, message="该邮箱已被注册") * @UniqueEntity(fields={"username"}, message="该用户名已被使用") */ class User implements UserInterface, PasswordAuthenticatedUserInterface { // 原有属性代码保持不变 }
2. 控制器中添加手动校验逻辑
先注入Symfony\Component\Validator\Validator\ValidatorInterface到控制器,在持久化之前执行校验,校验不通过直接返回错误,不执行数据库操作:
// 可通过构造方法注入或者控制器方法参数注入ValidatorInterface public function register(Request $request, PasswordHasherInterface $passwordHasher, EntityManagerInterface $entityManager, ValidatorInterface $validator) { $jsonRequest = json_decode($request->getContent(), true); $User = new User(); $User->setEmail($jsonRequest["email"]); $User->setUsername($jsonRequest["username"]); $User->setFirstName($jsonRequest["firstName"]); $User->setLastName($jsonRequest["lastName"]); $User->setRoles((array)"ROLE_USER"); $pass = $passwordHasher->hashPassword($User, $jsonRequest["password"]); $User->setPassword($pass); // 执行实体校验 $errors = $validator->validate($User); if (count($errors) > 0) { // 校验不通过,可根据业务需求格式化错误返回 $errorMessages = []; foreach ($errors as $error) { $errorMessages[$error->getPropertyPath()] = $error->getMessage(); } return $this->json(['errors' => $errorMessages], 400); } $entityManager->persist($User); $entityManager->flush(); // 校验通过后的成功逻辑 return $this->json(['message' => '注册成功'], 201); }
内容的提问来源于stack exchange,提问作者Phaired
相关产品推荐
相关产品推荐

