使用Symfony 3我寫了一個應該通過JSON/JMSSerializer公開的實體(以RESTful方式)。它看起來像這樣:JMSSerializer:使用ID從數據庫中檢索相關對象
/**
* MainEntity
*
* @ORM\Table(name="MainEntity")
* @ORM\Entity
*
*/
class MainEntity{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
//... some more "simple" fields ...
/**
* @ORM\ManyToOne(targetEntity="SubEntity")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="subentity", referencedColumnName="id")
* })
* @JMS\Accessor(getter="getSubEntityId",setter="setSubEntity")
* @JMS\Type("integer")
* @JMS\SerializedName("subEntityId")
*/
private $subEntity;
//...
public function getSubEntityId() {
return $this->subEntity->getId();
}
}
整個事情的JSON序列化就像一個魅力!尤其是,只有子實體ID纔會暴露,而不是整個子實體,這可能相當大。
所以不是:
{"id": 1, ..., "subEntity": {"id": 123, "name": "Great subEntity", ...} }
我得到
{"id": 1, ..., "subEntityId": 123 }
這是完全是我啃老族。
但是,當涉及到德系列化,我遇到麻煩......當然我還需要使用縮短的JSON格式的傳入的請求,但這種失敗,因爲setSubEntity
需要一個SubEntity
實例,而不是一個號碼。
有沒有什麼辦法可以實現反序列化來檢索相關對象ID時給出?
我想過這些可能性:
- 使用一個特殊的制定者(在
@JMS\Accessor
註釋給出),採取id和填充從數據庫中檢索對象的subEntity
場。但是這意味着將EntityManager注入實體(或類似的和不好的...) - 添加一個新的數字字段
subEntityId
並讓它由一個特殊的setter(如上圖)填充。然後使用控制器讀取它,從數據庫中獲取SubEntity
對象,並在之後使用setSubEntity
方法實體被反序列化。對我來說也不好看......
有什麼建議嗎?我看到,在Stackoverflow上有一些類似的問題,但在我看來,沒有人描述我的特例。
非常感謝提前!
非常有幫助!謝謝! – ahuemmer