Symfony EntityRepository返回实例的";代理\“CG”u“MyModelName”;
质疑Symfony EntityRepository返回实例的";代理\“CG”u“MyModelName”;,symfony,doctrine,Symfony,Doctrine,质疑 返回proxy\\uu\CG\uuu\AppBundle\Entity\User的对象实例,而不是AppBundle\Entity\User。原因是什么?原则是从自动生成的类中为您提供一个代理对象,该类扩展了您的实体并实现了\原则\ORM\proxy\proxy。您可以在app/cache/dev/doctor/orm/Proxies/中查看这些自动生成类的代码 代理对象允许Doctrine提供的一组行为,否则您必须显式地编码到实体中,包括对延迟加载属性的支持。例如,如果对象具有对另一个实
返回
proxy\\uu\CG\uuu\AppBundle\Entity\User
的对象实例,而不是AppBundle\Entity\User
。原因是什么?原则是从自动生成的类中为您提供一个代理对象,该类扩展了您的实体并实现了\原则\ORM\proxy\proxy
。您可以在app/cache/dev/doctor/orm/Proxies/
中查看这些自动生成类的代码
代理对象允许Doctrine提供的一组行为,否则您必须显式地编码到实体中,包括对延迟加载属性的支持。例如,如果对象具有对另一个实体的引用(例如从OneToOne
/OneToMany
/ManyToOne
//manytomone
关联),则在检索用户
记录时不一定要始终加载这些引用,因为它们可能并非始终相关。延迟加载允许稍后按需引入该数据
为了执行延迟加载,实体需要访问条令,以便它可以要求条令检索相关数据。这是通过提供给代理对象的\uuuu初始值设定项\uuu
属性完成的。其余的则由条令处理,代码不需要知道细节。有时我们需要分别确定实体的真实类名
条令使用静态方法,放置在助手类中:“条令\Common\Util\ClassUtils”,用于生成代理类的名称。
以下是描述:
如果您想获得真实的类名,只需使用:
$entityClassName=ClassUtils::getClass($entityObject)代码>
我发现这对于记录实体数据更改非常有用(原始实体可以通过id
和类名
确定)
希望它能有所帮助。为什么不直接使用$em->getRepository('AppBundle:User')->find($id)
;请填写你的答案,并告诉我怎么做!奇怪的是,有时候(比如在验证用户和调用用户提供者时),它会返回一个真实的实体。但稍后调用时,它将返回一个代理。请注意,此ClassUtils已弃用。仍然可以复制ClassUtils::getRealClass($class)
$em->getRepository($this->getRepositoryName('AppBundle:User'))->find($id);