gpt4 book ai didi

带有固定装置的 symfony 4,getReference 方法不返回预期的对象(返回 PROXY/__CG__/... 而不是 User 类的实例)

转载 作者:行者123 更新时间:2023-12-05 06:31:18 24 4
gpt4 key购买 nike

在 symfony 4 中,我创建了两个 fixtures 类。当我运行命令“./bin/console doctrine:fixtures:load”时,出现此错误:

Argument 1 passed to App\Entity\Article::setAuthor() must be an instance of User, instance of Proxies\__CG__\App\Entity\User given, called in /home/okli/PhpstormProjects/nomads_fiction/src/DataFixtures/ArticleFixtures.php on line 53

从 fixture 1(调用的第一个 fixture)开始,我使用以下代码创建了一个用户:

$myuser = new User();
$myuser->setName("foo");
...

$em->persist($myuser);
$em->persist();

$this->addReference("foo", $myuser);
$this->log->info("class is : " . get_class($myuser)); // print "class is : App\Entity\User" its good !

从夹具 2 中,我像这样加载了 myuser 对象:

$myuser = $this->getReference("foo");
$this->log->info("class is : " . get_class($myuser)); // print "class is : Proxies\__CG__\App\Entity\User", why not App\Entity\User ?

为什么 getReference 没有返回我从 fixture 1 返回的完全相同的对象?我的错误在哪里?

谢谢你的帮助:)

最佳答案

这正是它应该做的。 getReference() 函数允许您获取对标识符已知的实体的引用,而无需从数据库中加载该实体,该实体是为用户生成的类的代理对象。完整文档 here

事实上,如果您使用代理对象,学说并不关心。要使您的代码正常工作,您需要做的就是从 Article 实体中的 setAuthor 函数中删除类型提示(即 setAuthor(User $user) 到 setAuthor($user))。

这会起作用,因为您希望通过调用 setAuthor 函数来实现的是建立与实体的关联。由于您已经拥有此实体的标识符,因此不必完全加载它。

编辑:正如 Matías Navarro Carter 所观察到的,实体代理类扩展了真实的实体类,因此类型提示无论如何都应该起作用。我猜你忘了在你的 Article 实体中使用适当的命名空间。也许您在 Article.php 中遗漏了这样的内容:

use App\Entity\User;

关于带有固定装置的 symfony 4,getReference 方法不返回预期的对象(返回 PROXY/__CG__/... 而不是 User 类的实例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51847581/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com