询问
$em->getRepository($this->getRepositoryName('AppBundle:User'))->find($id);
Run Code Online (Sandbox Code Playgroud)
返回对象实例Proxies\__CG__\AppBundle\Entity\User而不是AppBundle\Entity\User.这是什么原因?
jba*_*ord 14
Doctrine从一个自动生成的类中为您提供了一个代理对象,该类扩展了您的实体和实现\Doctrine\ORM\Proxy\Proxy.您可以在中查看这些自动生成的类的代码app/cache/dev/doctrine/orm/Proxies/.
代理对象允许Doctrine提供的一组行为,否则您必须显式地编码到您的实体中,包括支持延迟加载属性.例如,如果您的对象具有对另一个实体的引用(例如来自OneToOne/ OneToMany/ ManyToOne/ ManyToMany关联),则在检索User记录时不一定要始终加载这些引用,因为它们可能始终不相关.延迟加载允许稍后按需引入数据.
为了执行延迟加载,实体需要访问Doctrine,以便它可以要求Doctrine检索相关数据.这是通过__initializer__提供给代理对象的属性完成的.其余的事情发生,由Doctrine处理,没有你的代码需要知道细节.
有时我们需要分别确定实体的真实类名称。
Doctrine使用放置在帮助程序类“ Doctrine \ Common \ Util \ ClassUtils”中的静态方法来生成代理类的名称。这是描述:ClassUtils类。
如果您想获得真实的类名,请使用:
$entityClassName = ClassUtils::getClass($entityObject);。
我发现这对于记录实体数据更改很有用(原始实体可以通过id和来确定class name)。
希望对您有所帮助。
| 归档时间: |
|
| 查看次数: |
7392 次 |
| 最近记录: |