我有以下用例:
在我的用户表中,我有一个已被软删除的用户,并且对电子邮件字段具有唯一约束。
用户使用同一电子邮件再次注册。通过API平台POST请求。我的目标是检查该 POST 请求是否存在用户,并从垃圾箱中恢复它。
我尝试了以下 2 个选项:
在 POST 请求中反序列化时,我尝试检查用户是否存在并将用户 ID 添加到反序列化数据数组中。
但问题是 API 平台表示在 POST 请求期间不可能进行更新。
我尝试了以下方法:
public function prePersist(PrePersistEventArgs $args): void
{
$entity = $args->getObject();
// it must be a user!
if (!$entity instanceof User) {
return;
}
// check for old user
$existing = $this->userRepository->findDeletedUser($entity);
if (!empty($existing)) {
$this->em->detach($entity);
$entity = $this->userRepository->recoverUser($existing, $entity);
}
// continue on the normal sign up stuff...
}
但这给了我一个独特的约束错误,即用户已经存在。
我该如何解决这个问题?
只需使用状态处理器
像这样:
final class SignUpStateProcessor implements ProcessorInterface
{
/**
* @param \App\ApiResource\SignUp $signUp
*/
public function process(
mixed $signUp,
Operation $operation,
?array $uriVariables = null,
?array $context = null
): SignUp {
$existing = $this->userRepository->findDeletedUser($signUp);
if ($existing !== null) {
return $this->userRepository->recoverUser($existing, $signUp);
}
$this->entityManager->persist($signUp);
$this->entityManager->flush();
return $signUp;
}
}