查询
$em->getRepository($this->getRepositoryName('AppBundle:User'))->find($id);
返回Proxies\__CG__\AppBundle\Entity\User
的对象实例,而不是AppBundle\Entity\User
。这是什么原因?
答案 0 :(得分:9)
Doctrine从自动生成的类中为您提供代理对象,该类扩展您的实体并实现\Doctrine\ORM\Proxy\Proxy
。您可以在app/cache/dev/doctrine/orm/Proxies/
。
代理对象允许Doctrine提供的一组行为,否则您必须显式地编码到您的实体中,包括支持延迟加载属性。例如,如果您的对象具有对其他实体的引用(例如来自OneToOne
/ OneToMany
/ ManyToOne
/ ManyToMany
关联),则您不一定想要在检索User
记录时始终加载这些引用,因为它们可能始终不相关。延迟加载允许稍后按需引入数据。
为了执行延迟加载,实体需要访问Doctrine,以便它可以要求Doctrine检索相关数据。这是通过提供给代理对象的__initializer__
属性完成的。其余的事情发生,由Doctrine处理,没有你的代码需要知道细节。
答案 1 :(得分:4)
有时我们需要分别确定实体的真实类名。
Doctrine使用静态方法,放在辅助类中:' Doctrine \ Common \ Util \ ClassUtils',用于生成代理类的名称。 以下是说明:Class ClassUtils。
如果您想获得真正的班级名称,请使用:
$entityClassName = ClassUtils::getClass($entityObject);
。
我发现这对于记录实体数据更改很有用(原始实体可以由id
和class name
确定。)
希望它有用。