我正在建立一个清单,以练习使用Symfony构建Web应用程序。通过将字符串输入表单并按下提交按钮来工作。输入内容存储在数据库中。
我想将数据库中存储的输入返回到网页。
当前,输入存储在数据库中,我已经在存储库中编写了DQL查询功能。
我的问题是我无法访问在控制器中创建的方法。
我的存储库中的方法:
/**
* @return Checklist[]
*/
public function getAllItemsForChecklist(): array
{
$qb = $this->createQueryBuilder('c')
->select('item')
->from('checklist', 'x')
->getQuery()
;
return $qb->execute();
}
尝试访问控制器中方法的行(失败):
$items = $this->getDoctrine()
->getRepository(ChecklistRepository::class)
->getAllItemsForChecklist()
;
根据https://symfony.com/doc/master/doctrine.html#querying-for-objects-the-repository上的Symfony文档,这应该可以工作。但是,找不到方法“ getAllItemsForChecklist()。在我的IDE上给出以下消息:
在\ Doctrine \ Common \ Persistence \ ObjectRepository中找不到方法'getAllItemsForChecklist'
我不确定为什么它没有读取我指定的存储库类。
如果有人知道如何解决此问题,那么它将在我的存储库中找到我会很感激的方法。
如果还需要其他信息,请告诉我,我很乐意提供更多信息。
此致
史蒂夫
答案 0 :(得分:3)
欢迎使用StackOverflow!
首先,当您调用getRepository()
时,您必须传递实体类,而不是存储库本身,因此就像这样:
$this->getDoctrine()->getRepository(Checklist::class);
即使您这样做,您的IDE也不知道该方法存在。您的IDE实际上是错误的,该方法确实存在,您的IDE无法知道getRepository()
调用返回了什么对象。
如何避免这种情况?选择以下解决方案之一(它们都可以在PhpStorm中使用,选项1应该在任何地方都可以使用,选项2可能在所有现代IDE中都可以使用,我不知道其他IDE中对选项3的支持):
选项1:将其作为服务注入
public function myControllerRoute(ChecklistRepository $checklistRepository) {
// now your IDE knows what methods are inside the $checklistRepository
$items = $checklistRepository->getAllItemsForChecklist();
}
选项2:将其键入IDE(和其他开发人员)
public function myControllerRoute() {
/** @var ChecklistRepository $checklistRepository */
$checklistRepository = $this->getDoctrine()->getRepository(Checklist::class);
// after the typehint the IDE knows what type it is
$items = $checklistRepository->getAllItemsForChecklist();
}
选项3:使用断言
public function myControllerRoute() {
$checklistRepository = $this->getDoctrine()->getRepository(Checklist::class);
assert($checklistRepository instanceof ChecklistRepository);
// after the assert the IDE knows what type it is
$items = $checklistRepository->getAllItemsForChecklist();
}
选项2和3几乎相同,但是选项3具有一个额外的好处,即在生产环境{{上,如果$checklistRepository
不是ChecklistRepository
的实例,则在开发机器上它将抛出异常。 1}}调用将被忽略,根本不会减慢执行速度。