为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
MMMHUHU 2021-05-04 17:29:51
我正在建立一个清单,以练习使用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'我不确定为什么它没有读取我指定的存储库类。如果有人知道如何解决此问题,那么它将可以找到我在存储库中所做的方法,将不胜感激。另外,如果需要任何其他信息,请告诉我,我很乐意提供更多信息。
查看完整描述

1 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

欢迎使用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()调用将被忽略并且不会降低执行速度。


查看完整回答
反对 回复 2021-05-21
  • 1 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号