【问题标题】:Symfony EntityRepository return instance of "Proxies\__CG__ MyModelName"Symfony EntityRepository 返回“Proxies\__CG__ MyModelName”的实例
【发布时间】:2016-01-18 17:17:33
【问题描述】:

查询

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

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

【问题讨论】:

  • 你为什么不简单地使用$em->getRepository('AppBundle:User')->find($id);

标签: symfony doctrine


【解决方案1】:

Doctrine 为您提供了一个来自自动生成的类的代理对象,该类扩展了您的实体并实现了\Doctrine\ORM\Proxy\Proxy。您可以在app/cache/dev/doctrine/orm/Proxies/ 中查看这些自动生成的类的代码。

代理对象允许 Doctrine 提供的一组行为,否则您必须在实体中显式编码,包括支持延迟加载属性。例如,如果您的对象具有对另一个实体的引用(例如来自 OneToOne/OneToMany/ManyToOne/ManyToMany 关联),则您不一定要在检索您的User 记录,因为它们可能并不总是相关的。延迟加载允许稍后按需引入数据。

为了执行延迟加载,实体需要访问 Doctrine 以便它可以要求 Doctrine 检索相关数据。这是通过提供给代理对象的__initializer__ 属性完成的。剩下的事情就会发生,由 Doctrine 处理,你的代码不需要知道细节。

【讨论】:

  • 请完成您的答案并告诉您如何做!
  • 奇怪的是有时(比如在验证用户和调用用户提供者时),它返回一个真实的实体。但稍后调用,它会返回一个代理。
【解决方案2】:

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

Doctrine 使用静态方法,放置在辅助类中:'Doctrine\Common\Util\ClassUtils',用于生成代理类的名称。 这是描述:Entities, Proxies and Reflection

如果你想得到一个真实的类名,只需使用:

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

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

希望对您有所帮助。

【讨论】:

  • 请注意,这个 ClassUtils 已被弃用。照搬ClassUtils::getRealClass($class)的小逻辑还是可以的
猜你喜欢
  • 2021-07-24
  • 2022-08-16
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
  • 2014-06-04
相关资源
最近更新 更多