Symfony 6 + API 平台 - 在发布新实体时更新现有实体

问题描述 投票:0回答:1

我有以下用例:

在我的用户表中,我有一个已被软删除的用户,并且对电子邮件字段具有唯一约束。

用户使用同一电子邮件再次注册。通过API平台POST请求。我的目标是检查该 POST 请求是否存在用户,并从垃圾箱中恢复它。

我尝试了以下 2 个选项:

选项1:挂钩API平台的反序列化过程

在 POST 请求中反序列化时,我尝试检查用户是否存在并将用户 ID 添加到反序列化数据数组中。

但问题是 API 平台表示在 POST 请求期间不可能进行更新。

选项2:签入Doctrine中的prePersist()

我尝试了以下方法:

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...
   
}

但这给了我一个独特的约束错误,即用户已经存在。

我该如何解决这个问题?

php symfony doctrine-orm api-platform.com symfony6
1个回答
0
投票

只需使用状态处理器

像这样:

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.