微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Api Platform无法持久保存嵌入式对象

如何解决Api Platform无法持久保存嵌入式对象

我还是api平台的新手。我有两类用户和公司。用户拥有公司。在用户上使用api平台发布操作时,它不是在设置现有公司或创建新公司。相反,它尝试将comapny设置为NULL来保留用户,这显然会失败。我在下面包含了我的代码和json请求正文。任何帮助将不胜感激。

/**
 * @ApiResource(
 *     collectionoperations={
 *          "get"={
 *              "normalization_context"={
 *                  "groups"={"get"}
 *              }
 *          },*          "post"={
 *              "denormalization_context"={
 *                  "groups"={"post"}
 *              },*              "normalization_context"={
 *                  "groups"={"get"}
 *              }
 *          }
 *     },*     itemOperations={
 *          "get"={
 *              "normalization_context"={
 *                  "groups"={"get"}
 *              }
 *          },*          "put"={
 *              "denormalization_context"={
 *                  "groups"={"put"}
 *              },*              "normalization_context"={
 *                  "groups"={"get"}
 *              }
 *          },*          "delete"
 *     },*     subresourceOperations={
 *          "api_companies_users_get_subresource"={
 *              "method"="GET",*              "normalization_context"={
 *                  "groups"={"get-company-users"}
 *              }
 *          }
 *     }
 * )
 * @ORM\Entity(repositoryClass=UserRepository::class)
 * @UniqueEntity("code")
 * @UniqueEntity("username")
 * @UniqueEntity("email")
 */
class User implements UserInterface
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     * @ApiProperty(identifier=false)
     */
    private $id;

    /**
     * @ORM\Column(type="guid",unique=true)
     * @ApiProperty(identifier=true)
     */
    private $code;

    /**
     * @ORM\Column(type="string",length=255,unique=true)
     * @Assert\NotBlank()
     * @Assert\Length(min="6",max="255")
     * @Groups({"get","post","put","get-company-users"})
     */
    private $username;

    /**
     * @ORM\Column(type="string",length=255)
     * @Assert\Regex(
     *    pattern="/(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+\-=\[\]{};':\x22\\|,.<>\/?]).{7,}/",*    message="Password must be at least 8 characters long and contain at least one digit,one uppercase letter,one lowercase letter,and one special character",*    groups={"post"}
     *   )
     * @Groups({"post"})
     */
    private $password;

    /**
     * @ORM\Column(type="array")
     */
    private $roles = ['ROLE_USER'];

    /**
     * @ORM\Column(type="string",length=255)
     * @Assert\NotBlank()
     * @Assert\Length(min="1",max="255")
     * @Groups({"post","put"})
     */
    private $fname;

    /**
     * @ORM\Column(type="string","put"})
     */
    private $lname;

    /**
     * @ORM\Column(type="string",unique=true)
     * @Assert\NotBlank()
     * @Assert\Email()
     * @Assert\Length(max="255")
     * @Groups({"get","put"})
     */
    private $email;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Company",inversedBy="users")
     * @ORM\JoinColumn(nullable=false)
     * @Groups({"get","post"})
     * @Assert\NotNull()
     */
    private $company;

    public function __construct()
    {
        $this->code = Uuid::v4()->toRfc4122();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getCode(): ?string
    {
        return $this->code;
    }

    public function getUsername(): ?string
    {
        return $this->username;
    }

    public function setUsername(string $username): self
    {
        $this->username = $username;

        return $this;
    }

    public function getpassword(): ?string
    {
        return $this->password;
    }

    public function setPassword(string $password): self
    {
        $this->password = $password;

        return $this;
    }

    public function getRoles(): ?array
    {
        return $this->roles;
    }

    public function setRoles(array $roles): self
    {
        $this->roles = $roles;

        return $this;
    }

    public function getFname(): ?string
    {
        return $this->fname;
    }

    public function setFname(string $fname): self
    {
        $this->fname = $fname;

        return $this;
    }

    public function getLname(): ?string
    {
        return $this->lname;
    }

    public function setLname(string $lname): self
    {
        $this->lname = $lname;

        return $this;
    }

    /**
     * @Groups({"get","get-company-users"})
     */
    public function getFullName(): string
    {
        return $this->fname . ' ' . $this->lname;
    }

    public function getEmail(): ?string
    {
        return $this->email;
    }

    public function setEmail(string $email): self
    {
        $this->email = $email;

        return $this;
    }

    public function getCompany(): ?Company
    {
        return $this->company;
    }

    public function setCompany(Company $company): self
    {
        $this->company = $company;

        return $this;
    }


    public function getSalt()
    {
        if ($this->email) {
            return $this->email;
        }

        return '';
    }

    public function eraseCredentials()
    {
    }
}
/**
 * @ApiResource(
 *     collectionoperations={
 *          "get",*          "post"={
 *              "denormalization_context"={
 *                  "groups"={"post"}
 *              }
 *          }
 *     },*     itemOperations={
 *          "get"={
 *              "normalization_context"={
 *                  "groups"={"get-company-users"}
 *              }
 *          },*          "delete"
 *     }
 * )
 * @ORM\Entity(repositoryClass=CompanyRepository::class)
 * @UniqueEntity("code")
 * @UniqueEntity("name")
 */
class Company
{
    const APP_COMPANY_NAME = 'AppointmentSetter';

    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     * @ApiProperty(identifier=false)
     */
    private $id;

    /**
     * @ORM\Column(type="guid",unique=true)
     * @Assert\NotBlank()
     * @Assert\Length(min="2","get-company-users"})
     */
    private $name;

    /**
     * @ORM\OnetoMany(targetEntity="App\Entity\User",mappedBy="company")
     * @ApiSubresource()
     * @Groups({"get-company-users","get"})
     */
    private $users;

    public function __construct()
    {
        $this->users = new ArrayCollection();
        $this->code = Uuid::v4()->toRfc4122();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getCode(): ?string
    {
        return $this->code;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getUsers(): Collection
    {
        return $this->users;
    }

    public function setUsers(Collection $users): self
    {
        $this->users = $users;

        return $this;
    }

    public function addUser(User $user): self
    {
        $this->users->add($user);

        return $this;
    }

    public function removeUser(User $user): self
    {
        $this->users->removeElement($user);

        return $this;
    }
}

和json

{
    "username": "newuser","email": "newuser@example.com","fname": "John","lname": "Doe","password": "********","company": {
        "@id": "/api/companies/72366654-0014-4f9c-9a85-ee123dbfd3db"
    }
}

更多信息: 如下面的代码片段所示,我可以通过添加级联持久性来使其持久化嵌入式实体。但是,如果不创建新公司,我仍然无法坚持新用户。它要么找不到,要么不尝试像上面的json正文中那样查找实体。任何帮助表示赞赏。

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Company",inversedBy="users",cascade={"persist"})
     * @ORM\JoinColumn(nullable=false)
     * @Groups({"get","post"})
     * @Assert\NotNull()
     */
    private $company;

解决方法

我解决了我应该说的一个问题。

我在问题编辑中提到的第一个问题。我需要在关系定义中添加cascade = {“ persist”}属性,以使其保留新实体。

第二个问题是json的格式,请参见下面的更正。

{
    "username": "newuser","email": "newuser@example.com","fname": "John","lname": "Doe","password": "********","company": "/api/companies/72366654-0014-4f9c-9a85-ee123dbfd3db"
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。