Symfony | 如何从控制器中的存储库访问自定义方法?

我正在建立一个清单,以练习使用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'


我不确定为什么它没有读取我指定的存储库类。


如果有人知道如何解决此问题,那么它将可以找到我在存储库中所做的方法,将不胜感激。


另外,如果需要任何其他信息,请告诉我,我很乐意提供更多信息。


MMMHUHU
浏览 123回答 1
1回答

元芳怎么了

欢迎使用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。在生产环境中,assert()调用将被忽略并且不会降低执行速度。
打开App,查看更多内容
随时随地看视频慕课网APP