交响乐 |如何从控制器中的存储库访问自定义方法?
Symfony | How to access the custom methods from the respository in a controller?
我正在设置一个清单来练习使用 Symfony 构建 Web 应用程序。它通过将字符串输入表单并按下提交按钮来工作。输入存储在数据库中。
我想return将数据库中的输入存储到网页中
目前,输入存储在数据库中,我在我的存储库中编写了一个 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:
上给出了以下消息
Method 'getAllItemsForChecklist' not found in \Doctrine\Common\Persistence\ObjectRepository
我不确定为什么它不读取我指定的存储库 class。
如果有人知道如何解决这个问题,那么它将非常感谢我在我的存储库中创建的方法。
此外,如果需要任何额外信息,请告诉我,我很乐意提供更多信息。
此致,
史蒂夫
欢迎使用 Whosebug!
首先,当您调用 getRepository()
时,您必须传递实体 class,而不是存储库本身,因此它会像这样:
$this->getDoctrine()->getRepository(Checklist::class);
即使您这样做,您的 IDE 也不知道该方法的存在。您的 IDE 实际上是错误的,该方法确实存在,您的 IDE 只是无法知道从 getRepository()
调用返回了什么对象。
如何避免这种情况?选择这些解决方案之一(它们都适用于 PhpStorm,选项 1 应该适用于所有地方,选项 2 可能适用于所有现代 IDEs,我不知道选项 3 在其他 IDE 中的支持]s):
选项 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
的实例,在开发机器上它将抛出异常,在生产环境中assert()
调用被忽略并且根本不会减慢执行速度。
我正在设置一个清单来练习使用 Symfony 构建 Web 应用程序。它通过将字符串输入表单并按下提交按钮来工作。输入存储在数据库中。
我想return将数据库中的输入存储到网页中
目前,输入存储在数据库中,我在我的存储库中编写了一个 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:
上给出了以下消息Method 'getAllItemsForChecklist' not found in \Doctrine\Common\Persistence\ObjectRepository
我不确定为什么它不读取我指定的存储库 class。
如果有人知道如何解决这个问题,那么它将非常感谢我在我的存储库中创建的方法。
此外,如果需要任何额外信息,请告诉我,我很乐意提供更多信息。
此致,
史蒂夫
欢迎使用 Whosebug!
首先,当您调用 getRepository()
时,您必须传递实体 class,而不是存储库本身,因此它会像这样:
$this->getDoctrine()->getRepository(Checklist::class);
即使您这样做,您的 IDE 也不知道该方法的存在。您的 IDE 实际上是错误的,该方法确实存在,您的 IDE 只是无法知道从 getRepository()
调用返回了什么对象。
如何避免这种情况?选择这些解决方案之一(它们都适用于 PhpStorm,选项 1 应该适用于所有地方,选项 2 可能适用于所有现代 IDEs,我不知道选项 3 在其他 IDE 中的支持]s):
选项 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
的实例,在开发机器上它将抛出异常,在生产环境中assert()
调用被忽略并且根本不会减慢执行速度。