ApiPlatform: как обновить вместо создания дочернюю сущность, которая не является ни @ApiResource, ни @ApiSubresource - PullRequest
0 голосов
/ 15 мая 2018

У меня есть ThirdPartyEntity из стороннего пакета, который, используя ThirdPartyEntityTrait, я связываю с MyEntity в моем проекте.

Теперь, поскольку ThirdPartyEntity не установлен ApiResource ни как ApiSubresource, так как у меня не настроена группа сериализации на MyEntity, когда я получаю MyEntity от ApiPlatform, он возвращает мне что-то вроде этого:

{
   "@id":"/api/my_entities/17",
   "@type":"MyEntity",
   "id":17,
   "third_party_entity": {
      "id":22,
      "a_property":"some value"
   }
}

НОЕСЛИ я PUT изменил значение для a_property с этим body:

{
   "@id":"/api/my_entities/17",
   "@type":"MyEntity",
   "id":17,
   "third_party_entity": {
      "id":22,
      "a_property":"some NEW value to update"
   }
}

Я получаю новое third_party_entity, которое будет создано, и получу этот ответ:

{
   "@id":"/api/my_entities/17",
   "@type":"MyEntity",
   "id":17,
   "third_party_entity": {
      "id":23,
      "a_property":"some NEW value to update"
   }
}

ТАК, КАК МОЖНО ОБНОВЛЯТЬ third_party_entity вместо того, чтобы создавать его каждый раз?

ЗДЕСЬ ПРИНИМАЮТСЯ КЛАССЫ И ПРИЗНАКИ

/**
 * @ORM\Table(name="app_my_entities")
 * @ORM\Entity()
 * @ApiResource()
 */
class MyEntity
{
    // !!!!!!!!!!!!!!!!!!
    // This is the trait I use to link MyEntity
    // with the entity from the third-party bundle
    // !!!!!!!!!!!!!!!!!!
    use ThirdPartyEntityTrait;

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    ...
}

И этоThirdPartyEntityTrait:

trait ThirdPartyEntityTrait
{
    /**
     * @ORM\OneToOne(targetEntity="Namespace\To\Bundle\Entity\ThirdPartyEntity", cascade={"all"})
     * @ORM\JoinColumn(name="thirdPartyEntity", referencedColumnName="id")
     */
    private $thirdPartyEntity;

    /**
     * @param thirdPartyEntity $thirdPartyEntity
     *
     * @return ThirdPartyEntity
     */
    public function setThirdPartyEntity(thirdPartyEntity $thirdPartyEntity): ThirdPartyEntity
    {
        $this->thirdPartyEntity = $thirdPartyEntity;

        /** @var ThirdPartyEntity $this */
        return $this;
    }

    /**
     * @return thirdPartyEntity
     */
    public function getThirdPartyEntity(): ?thirdPartyEntity
    {
        return $this->thirdPartyEntity;
    }

    /**
     * @return thirdPartyEntity
     */
    public function removeThirdPartyEntity(): ?thirdPartyEntity
    {
        $thirdPartyEntity = $this->getThirdPartyEntity();

        $this->thirdPartyEntity = null;

        return $thirdPartyEntity;
    }
}

Как видите, ничего больше, чем свойство для сохранения отношения и некоторые методы доступа.

Вместо этого это связанный объект:

/**
 * @ORM\Entity()
 * @ORM\Table(name="third_party_entities")
 */
class ThirdPartyEntity
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @ORM\Column(name="aProperty", type="string", nullable=true)
     */
    private $aProperty;

    public function getId()
    {
        return $this->id;
    }

    public function getAProperty()
    {
        return $this->aProperty;
    }

    public function setAProperty($aProperty)
    {
        $this->aProperty = $aProperty;

        return $this;
    }
}

Этот вопрос также опубликован на GitHub.

...