在API平台中,我们可以使用嵌入关系注解来指定实体之间的关系,并在更新实体时尝试更新所有嵌入的实体。同时,我们可以使用Doctrine的级联操作来实现这一目标。
首先,确保你的实体类之间已经正确地定义了嵌入关系。例如,假设我们有一个User
实体和一个Address
实体,其中User
实体嵌入了Address
实体。
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
*/
class User
{
// ...
/**
* @ORM\Embedded(class="Address")
*/
private $address;
// ...
}
class Address
{
/**
* @ORM\Column(type="string")
*/
private $street;
/**
* @ORM\Column(type="string")
*/
private $city;
// ...
}
接下来,在API平台中配置实体资源的更新操作,以便在更新User
实体时尝试更新嵌入的Address
实体。
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Annotation\ApiProperty;
/**
* @ApiResource(
* collectionOperations={},
* itemOperations={
* "put"={
* "deserialize"=false,
* "security"="is_granted('ROLE_USER') and object == user",
* "validation_groups"={"Default", "update"}
* }
* }
* )
*/
class User
{
// ...
/**
* @ApiProperty(writable=true)
*/
private $address;
// ...
}
最后,在Doctrine中配置级联操作,以确保在更新User
实体时也更新嵌入的Address
实体。
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity
*/
class User
{
// ...
/**
* @ORM\Embedded(class="Address", columnPrefix=false)
* @ORM\AttributeOverrides({
* @ORM\AttributeOverride(name="street", column=@ORM\Column(name="address_street")),
* @ORM\AttributeOverride(name="city", column=@ORM\Column(name="address_city"))
* })
* @ORM\OnFlush
*/
private $address;
// ...
}
使用以上代码示例,当你更新User
实体时,API平台将尝试将更新操作应用到嵌入的Address
实体。
下一篇:API平台忽略了JWT访问。