我正在尝试从数据库中获取一个项目并将其传递给新项目以推送到数据库。
$post = $entityManager->getRepository('App:Post')
->find($id);
$comment->setPost($post)
在setPost
如下所示:
public function setPost(Post $post): self
{
$this->post = $post;
return $this;
}
和$post
变量:
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Post", inversedBy="comments")
* @ORM\JoinColumn(nullable=false)
*/
private $post;
但是,当我尝试设置类似的帖子setPost($post)
时,出现以下错误:
提供了“ \ App \ Entity \ Post”,“ object”类型的预期参数
我认为,您看到的错误来自集成开发环境(IDE),例如eclipse,vs代码,phpstorm等。但是代码-实际执行时-应该可以工作。
现在,错误很可能是由于在所述IDE的后台运行静态代码分析引起的,该代码分析将查看该语句并尝试根据调用的方法,访问的属性等来分析变量类型。
因此,让我们慢慢地进行操作(您可以将鼠标悬停在上$vars
并->methods()
进行验证。我感兴趣的那行是
$post = $entityManager->getRepository('App:Post')
->find($id);
同样$entityManager
是type EntityManagerInterface
,它具有一个getRepository
带有一个类型为必需参数的方法string
('App:Post'
在您的情况下),它将返回一个type的对象ObjectRepository
,该对象具有一个find
需要一个参数的方法(mixed
不问),并返回?object
表示,object
或null
。因此,$post
是类型的object
(最佳情况,或者为null,在这种情况下它将失败!)。现在,下一行显然需要一个类型的参数,Post
而不是类型的参数object
,因此是警告/通知/错误。
现在,静态代码分析在一定程度上是很有帮助的,但是它并不是有一定限制的,因为它有局限性。它不知道什么运行时会真正返回,它只是假设(理论)在代码中找到的类型提示足够具体-在您的情况下不是。
添加一个文档字符串以告诉静态代码分析该变量$post
的实际类型是什么:
/** @var Post $post */
$post = $entityManager->getRepository('App:Post')
->find($id);
这可以明确地告诉您静态分析工具$post
的类型Post
,也许您必须编写App\Entity\Post
甚至\App\Entity\Post
。
或者,您可以实现自己的方法PostRepository
(该原理提供了一些帮助),并定义了一个函数function findById($id) :Post
-,该函数将明确告诉静态代码分析,在代码中调用返回类型是什么(通过依赖注入注入到函数中PostRepostory $postRepository
):
$post = $postRepository->findById($id);
如果您使用大量不同的实体,这是一个非常冗长的解决方案,但是根据您的项目,这可能是值得的,因为您显式地命名了依赖项,而不是注入非常不确定的(如我们所见)EntityManagerInterface
。使用EntityManagerInterface可能会测试HELL(imho!)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句