Php symfony原则鉴别器错误序列化程序

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

我使用一个平台来开发RESTAPI,现在当我在normalize和denormalize中序列化数据时,我发现了一个错误。我对实体使用条令继承,我有类person抽象类内容commons属性,我创建类Partner、Participant和Declarent,所有类都为person类扩展,现在当我在Participant类中添加组时,我发现错误,错误是当我在显示的partner和Declarator属性中添加组时,但当我在attributes class Person中添加组时,则不会显示class Participant中的属性

个人和实体:

<?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平台也不支持

反序列化忽略父类属性或子类属性

真正的问题是你为什么需要继承

  • 要添加链接到Person的新实体类
  • 要使用多态性,比如
    公共函数heal(Person$Person):void{}
  • 收集公共属性
  • 如果是1.,你就完全搞砸了。例如,假设您要添加一个类:

    /*
     * @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"}