簡體   English   中英

Doctrine如何設置私有ID

[英]How does Doctrine set private IDs

在PHP中,我可以創建一個帶有private / protected $id變量且沒有setter的模型。

Doctrine ORM能夠在保存/加載對象時設置該屬性。

這在內部如何運作? 我假設這是由序列化處理的,但我無法找到負責此行為的代碼。

第一次doctrine實例化一個實體(例如User )時,它會這樣做:

$this->prototype = unserialize(sprintf('O:%d:"%s":0:{}', strlen($this->name), $this->name));

在不調用構造函數的情況下創建該類型的對象(反序列化避免了對__construct的調用,並且他們故意這樣做,因此他們不必擔心構造函數的外觀或內容)。

初始化第一個對象后,Doctrine使用clone創建相同對象類型的新實例。

$entity = clone $this->prototype;

從克隆的對象,它將:

$reflection = new \ReflectionObject($entity);
$property = $reflection->getProperty('idField');
$property->setAccessible(true);
$property->setValue($entity, 123);

由於Doctrine對復合主鍵的支持,實際執行此操作的代碼更為復雜,但這有助於指導您正確的方向。

Doctrine ORM使用反射分配標識符 這是在您的實體的類元數據中完成的。

當ORM必須在不使用構造函數參數的情況下在內部實例化它們時,非序列化僅用於創建實體的新實例 (藍圖)。 一旦藍圖可用,就會為每個新請求的實例克隆它。

官方網站上有一個博客文章, 解釋了Doctrine如何創建實體的新實例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM