У меня есть 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.