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

Ром*_*зян 9 doctrine symfony

询问

$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处理,没有你的代码需要知道细节.

  • 请完成您的答案并告诉我们如何做! (3认同)
  • 奇怪的是,有时(例如,在对用户进行身份验证并调用用户提供程序时),它返回一个真实的实体。但是稍后调用,它将返回一个代理。 (2认同)

Sta*_*kyi 6

有时我们需要分别确定实体的真实类名称。

Doctrine使用放置在帮助程序类“ Doctrine \ Common \ Util \ ClassUtils”中的静态方法来生成代理类的名称。这是描述:ClassUtils类。

如果您想获得真实的类名,请使用:

$entityClassName = ClassUtils::getClass($entityObject);。

我发现这对于记录实体数据更改很有用(原始实体可以通过id和来确定class name)。

希望对您有所帮助。

  • 请注意,此 ClassUtils 已被弃用。仍然可以复制 `ClassUtils::getRealClass($class)` 的小逻辑 (2认同)