为什么在学说2中需要安全的唤醒和克隆方法?

Den*_*rdy 2 php orm symfony doctrine-orm

该文档警告了几次关于确保Doctrine 2实体上的唤醒和克隆实现,例如:

http://docs.doctrine-project.org/en/latest/cookbook/implementing-wakeup-or-clone.html

它没有说明为什么,但是......我认为它与没有弄乱Doctrine的实体管理器和它可能维护的内存缓存有关,但粗略地深入研究(巨大的)代码库不会说得更多,也没有快速搜索用户列表.

任何了解Doctrine internals的人都知道为什么Doctrine 2需要在实体上安全唤醒和克隆方法?

Jas*_*wer 6

Doctrine 2需要将从数据库中提取的数据转换为实体(php对象).这个过程称为水合作用.

Doctrine 2不使用传统的使用new运算符的方法(因此构造一个类),但它使用以下方法:

  • 它构建一个字符串,表示类的序列化空版本.
  • 它将该字符串反序列化以使其成为实际对象.这就是您需要安全实施的原因__wakeup.
  • 它将该对象存储为原型.

对于每个实体类,此过程都会执行一次.

然后,只要它需要水合一个实体,它就会克隆原型.这就是您需要安全实施的原因__clone.

这都是newInstance()ClassMetadataInfo中完成的一个小方法.

这样做的好处是当新实体被水合时不使用构造函数.这使得开发人员可以在构造函数中自由地执行任何他/她想做的事情(包括使用参数).

更新

您需要安全地实现__wakeup__clone方法的原因是:

因为Doctrine 2在需要对它们进行水合时会对实体进行反序列化和克隆,所以这些方法会被调用.但是当Doctrine 2执行此操作时,实体将不会拥有任何数据集(甚至不是标识符).之后将设置数据.

所以,当你实现它们以这样的方式,当实体的逻辑时,才执行确实有标识符(S),你确定你的逻辑只能执行时反序列化或克隆的实体,不是当教条2做的.