Symfony 5 未验证多个独立的唯一字段

问题描述

我正在尝试验证数据库中唯一的用户名和电子邮件

想象一下 DB Users 表中的这个场景:

用户名 电子邮件
艾康 aykon@aykon.sk
aykon94 aykon94@aykon.sk

我在用户实体中有此代码

/**
 * @ORM\Table(name="users")
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @Gedmo\SoftDeleteable(fieldName="deletedAt",timeAware=false)
 * @UniqueEntity(fields={"email"},groups={"register","edit"})
 * @UniqueEntity(fields={"username"},"edit"})
 */
class User implements UserInterface
{

这是我的注册函数

/**
 * @Route("/register",name="api_auth_register",methods={"POST"})
 * @return JsonResponse|RedirectResponse
 */
public function register(
    Request $request,EntityManagerInterface $entityManager,CustomSerializer $serializer,ValidatorInterface $validator,UserPasswordEncoderInterface $passwordEncoder
) {
    $user = $serializer->serializer->deserialize($request->getContent(),User::class,'json');
    assert($user instanceof User);
    $errors = $validator->validate($user,null,'register');

    if ($errors->count() !== 0) {
        return new JsonResponse(
            $serializer->serializer->serialize($errors,'json'),Response::HTTP_UNPROCESSABLE_ENTITY,[],true,);
    }

    $user->setPassword($passwordEncoder->encodePassword($user,$user->getpassword()));

    $entityManager->persist($user);
    $entityManager->flush();

    return $this->json([],Response::HTTP_CREATED);
}

当我发送此有效负载时:

{
    "username": "aykon","email": "aykon@aykon.sk","password": "password"
}

我得到了正确的 422 响应,错误用户名和电子邮件已被使用!

但是当我发送这个:

{
    "username": "aykon94","password": "password"
}

我收到不正确 422 响应,错误电子邮件 已被使用!

如何强制 symfony 继续验证并显示错误 用户名

这在注册期间不是大问题,因为当我更改电子邮件以通过验证 smt 时,例如 aykon199@aykon.sk,它会在用户名显示验证错误。我可以忍受。

但是当我尝试编辑用户例如 aykon 时,这意味着我已经在数据库中拥有用户名和电子邮件,并且我仅将用户名更改为 aykon94,验证在非唯一电子邮件 {{1} 处停止它忽略它,因为它是同一个对象。我从 DB 收到错误

aykon@aykon.sk

编辑: 提供编辑功能

 sqlSTATE[23000]: Integrity constraint violation: 19 UNIQUE constraint Failed: users.username"

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)