[英]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.