[英]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對復合主鍵的支持,實際執行此操作的代碼更為復雜,但這有助於指導您正確的方向。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.