如何解决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 举报,一经查实,本站将立刻删除。