Symfony EntityRepository返回" Proxies \ __ CG__ MyModelName"的实例

时间:2016-01-18 17:17:33

标签: symfony doctrine

查询

$em->getRepository($this->getRepositoryName('AppBundle:User'))->find($id);

返回Proxies\__CG__\AppBundle\Entity\User的对象实例,而不是AppBundle\Entity\User。这是什么原因?

2 个答案:

答案 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);

我发现这对于记录实体数据更改很有用(原始实体可以由idclass name确定。)

希望它有用。