如何解决适用于多个实体注释的ApiPlatform PUT关系
我对ApiPlatform有问题,希望能够轻松理解和解决。
上下文:我要使用以下指令更新地址字段:
curl --request PUT \
--url http://localhost/api/users/25 \
--header 'authorization: Bearer xxx' \
--header 'content-type: application/json' \
--data '{
"lastName" : "Bernard","firstName" : "Jean","dateBirth" : "1996-12-12","phone" : "0769397070","address" : {
"street" : "150 rue des paquerettes","pos": [ 66.344133,73.049472 ],"city": "Paris","postcode": "75001"
}
}
问题:当请求中定义了“地址”时,每条PUT指令都会创建一个新的地址实例。
实体:
应用/实体/用户
/**
* @ApiResource(
* attributes={
* "security"="is_granted('ROLE_ADMIN') or object == user",* "security_message"="User does not match the authenticated user"
* },* itemOperations={
* "get"={
* "normalization_context"={
* "groups"={"read:full:user","read:order"},* }
* },* "put"={
* "normalization_context"={"groups" ={ "read:full:user"}},* "denormalization_context"={"groups" ={ "write:user:customer","write:user:lawyer"}},* "security"="object == user"
* }
* },* collectionOperations={}
*)
* @UniqueEntity(
* fields={"email"},* message="This user is already registered",* groups={"create:customer","create:lawyer"}
* )
* @ORM\HasLifecycleCallbacks
* @ORM\Entity
*/
class User implements UserInterface
{
use Traits\Timestampable;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
// ...
/**
* @ORM\Column(type="string",length=255,nullable=false)
* @Assert\NotBlank
* @Groups({"create:customer","create:lawyer","read:full:user","write:user:customer","write:user:lawyer"})
*/
private $phone;
/**
* @ORM\OneToOne(targetEntity=Address::class,cascade={"persist"})
* @ORM\JoinColumn(nullable=true)
* @Groups({"create:customer","write:user:lawyer"})
*/
private $address;
// ...
}
应用/实体/地址
/**
* @ApiResource(
* denormalizationContext = {
* "groups" = {"create:lawyer","create:customer","write:user:lawyer"}
* },* itemOperations={
* "get"={
* "normalization_context"={"groups"={"read:lawyer","read:full:lawyer"}}
* },* }
* )
* @ORM\Entity(repositoryClass=AddressRepository::class)
*/
class Address
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string",nullable=true)
* @Groups({"read:full:lawyer","write:user:lawyer"})
*/
private $street;
}
我想在单个指令中修改其逻辑相关性已指定的实体(OneToOne)。 您对最佳解决方案有任何想法吗?
谢谢!
解决方法
一个替代解决方案是为数据提供者添加hydra属性“ @id”以关联对象。对于多个关系而言,这很自然,但对于OneToOne关系而言,这并不优雅。
curl --request PUT \
--url http://localhost/api/users/25 \
--header 'authorization: Bearer XXX' \
--header 'content-type: application/ld+json' \
--data '{
"lastName" : "Bernard","firstName" : "Jean","dateBirth" : "1996-12-12","phone" : "0769397070","address" : {
"@id" : "api/addresses/43","street" : "160 rue des paquerettes","pos": [ 66.44133,73.049472 ],"city": "Paris","postcode": "75001"
}
}'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。