Php symfony原则鉴别器错误序列化程序
我使用一个平台来开发RESTAPI,现在当我在normalize和denormalize中序列化数据时,我发现了一个错误。我对实体使用条令继承,我有类person抽象类内容commons属性,我创建类Partner、Participant和Declarent,所有类都为person类扩展,现在当我在Participant类中添加组时,我发现错误,错误是当我在显示的partner和Declarator属性中添加组时,但当我在attributes class Person中添加组时,则不会显示class Participant中的属性 个人和实体:Php symfony原则鉴别器错误序列化程序,php,symfony,doctrine-orm,doctrine,api-platform.com,Php,Symfony,Doctrine Orm,Doctrine,Api Platform.com,我使用一个平台来开发RESTAPI,现在当我在normalize和denormalize中序列化数据时,我发现了一个错误。我对实体使用条令继承,我有类person抽象类内容commons属性,我创建类Partner、Participant和Declarent,所有类都为person类扩展,现在当我在Participant类中添加组时,我发现错误,错误是当我在显示的partner和Declarator属性中添加组时,但当我在attributes class Person中添加组时,则不会显示cla
<?php
namespace App\Entity;
use App\Repository\PersonRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ORM\Entity(repositoryClass=PersonRepository::class)
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="discr", type="string")
* @ORM\DiscriminatorMap({"partner" = "Partner", "supplier" = "Supplier", "declaring"= "Declaring", "particpant"= "Particpant"})
*/
abstract class Person
{
use ResourceId;
use AbstractEntity;
/**
* @ORM\Column(type="string", length=255)
* @Groups({"readPartner","writePartner","readDeclaring",
* "writeDeclaring","readSupplier","writeSupplier","readParticpant","writeParticpant"})
*/
private $firstName;
/**
* @ORM\Column(type="string", length=255)
* @Groups({"readPartner","writePartner","readDeclaring",
* "writeDeclaring","readSupplier","writeSupplier","readParticpant","writeParticpant"})
*/
private $lastName;
/**
* @ORM\Column(type="string", length=255)
* @Groups({"readPartner","writePartner","readDeclaring",
* "writeDeclaring","readSupplier","writeSupplier"})
*/
private $personalPhone;
/**
* @ORM\Column(type="string", length=255,nullable=true)
* @Groups({"readPartner","writePartner","readDeclaring"
* ,"writeDeclaring","readSupplier","writeSupplier"})
*/
private $professionalPhone;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Assert\Email(
* message = "The email '{{ value }}' is not a valid email."
* )
* @Groups({"readPartner","writePartner","readDeclaring",
* "writeDeclaring","readSupplier","writeSupplier"})
*/
private $email;
/**
* @ORM\Column(type="string", length=255)
* @Groups({"readPartner","writePartner","readDeclaring"
* ,"writeDeclaring","readSupplier","writeSupplier"})
*/
private $organization;
public function getFirstName(): ?string
{
return $this->firstName;
}
public function setFirstName(string $firstName): self
{
$this->firstName = $firstName;
return $this;
}
public function getLastName(): ?string
{
return $this->lastName;
}
public function setLastName(string $lastName): self
{
$this->lastName = $lastName;
return $this;
}
public function getPersonalPhone(): ?string
{
return $this->personalPhone;
}
public function setPersonalPhone(string $personalPhone): self
{
$this->personalPhone = $personalPhone;
return $this;
}
public function getProfessionalPhone(): ?string
{
return $this->professionalPhone;
}
public function setProfessionalPhone(string $professionalPhone): self
{
$this->professionalPhone = $professionalPhone;
return $this;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(?string $email): self
{
$this->email = $email;
return $this;
}
public function getOrganization(): ?string
{
return $this->organization;
}
public function setOrganization(string $organization): self
{
$this->organization = $organization;
return $this;
}
}
即使条令很好地支持继承,api平台也不支持 反序列化忽略父类属性或子类属性 真正的问题是你为什么需要继承
公共函数heal(Person$Person):void{}
/*
* @ApiResource
* @ORM\Entity
*/
class Dog
{
/*
* @Column
*/
private $name;
/*
* @var Person
* @ManyToOne(class="Person")
*/
private $owner;
}
即使使用具体的Person类,序列化也不会按预期工作,IRI生成不会检测子类。您不会看到像这样的几个狗实例:
{"name": "Bar", "owner": "/participants/1"}
{"name": "Foo", "owner": "/partners/2"}
{"name": "Dummy", "owner": "/declarants/4"}
Api平台将尝试创建包含/persons字符串的IRI。获取/persons仅检索人员属性
如果是2.,您的实体只需要实现一个公共接口,或者您可以使用访问者模式
如果是3.,通常的方法是使用教义。他们支持@Groups注释。请提供任何帮助。给出的答案获得了支持票,但实际上,当涉及到通过区分对象处理继承时,ApiPlatform中存在一个缺陷。请参阅:为什么您的个人财产是私有的,而您的参与者财产受到保护?我想你把它们颠倒过来了,这样Particpant上的反射就可以看到Person属性。我的案例是添加一个链接到Person的新实体类,但我有错误序列化程序,同样在案例3中,我在多个表中发现了重复的attirubtes。对于链接的类,你必须自己找到最好的方法。关于多个表中的重复属性,首先这是预期的行为,其次我认为您误解了什么。你在使用教义。数据库由实体驱动。可嵌入对象允许您声明一次且仅声明一次所谓的重复列。每当您在可嵌入php类中更改某些内容时,这些更改将在下一次迁移时复制到所有表中。在大多数情况下,您必须使用条令忽略数据库实现。
{"name": "Bar", "owner": "/participants/1"}
{"name": "Foo", "owner": "/partners/2"}
{"name": "Dummy", "owner": "/declarants/4"}