了解PHP Fatal TypeError“必须是”主义symfony组件项目的实例

时间:2019-11-07 16:00:53

标签: php symfony doctrine-orm

我正在努力为OpenEMR中的报告奠定基础。 我是Symfony和Doctrine的新手 由于我正在使用Symfony组件。遵循这些教程有些困难,因为它们都假定充分利用了Symfony框架和理论支持。在我看来,我没有。我有这个方法调用ArSessionReposistory。

 public function getpaidata($payer_id)
{
    $row = $this->repository;
    return $row->getInsurerPaid($payer_id);
}

在ArSessionReposistory内部,正在调用的方法是

public function getInsurerPaid(ArSession $payer_id)
{
    $insurerPaid = $this->_em->getRepository($this->_entityName)->findBy([
        "payer_id" => $payer_id
    ]);

    return $insurerPaid;
}

错误消息是这样的:

 PHP Fatal error:  Uncaught TypeError: Argument 1 passed to OpenEMR\Repositories\ArSessionRepository::getInsurerPaid() must be an instance of OpenEMR\Entities\ArSession, integer given, called in C:\oerm_dev\www\dev\mindfulemr4\library\financialreports\src\FinancialSummaryByInsuranceController.php on line 72 and defined in C:\oerm_dev\www\dev\mindfulemr4\repositories\ArSessionRepository.php:26

我不理解ArSessionRepository :: getInsurerPaid()方法调用与ArSession之间的关系,在ArSession中,所有实体都与getter和setter一起列出。我希望有人可以解释“必须是实例”错误消息。

因为我现在想的是-> findBy(array)应该是ArSession中的一种方法,即使我试图使用该教义内置的findBy(array)方法。整个项目代码位于此处

https://github.com/juggernautsei/symfony_twig_doctrine_component

更新:

Nico Haase是对的,它确实很简单,与教义或Symfony无关。更改后

getInsurerPaid(ArSession $payer_id)

对此。我试图遵循别人的代码,这就是为什么我将其放置在这里。

getInsurerPaid($payer_id)

一切正常,应该正常进行。错误消失并且查询完成。在Github上查看更新的仓库。

1 个答案:

答案 0 :(得分:3)

关于您的错误

PHP Fatal error:  Uncaught TypeError: Argument 1 passed to OpenEMR\Repositories\ArSessionRepository::getInsurerPaid() must be an instance of OpenEMR\Entities\ArSession, integer given, called in C:\oerm_dev\www\dev\mindfulemr4\library\financialreports\src\FinancialSummaryByInsuranceController.php on line 72 and defined in C:\oerm_dev\www\dev\mindfulemr4\repositories\ArSessionRepository.php:26

发生此错误是因为函数getInsurerPaid()需要一个ArSession对象,但是当您在函数getpaidata()中调用它时,您正在向其传递整数。

相反,您应该编辑getInsurerPaid()函数以接受整数参数。

方法getInsurerPaid()应该从id 返回一个ArSession对象,因此您不必要求提供一个ArSession对象。

关于您的存储库方法

如果要从存储库中检索一行,则应使用findOneBy()方法,因为该方法将在创建对象时返回对象,否则将返回null

如果您要检索多个行并返回findBy()个对象,则array方法很有用。

更新的存储库方法

public function getInsurerPaid(int $payer_id)
{
    return $this->_em->getRepository($this->_entityName)->findOneBy([
        "payer_id" => $payer_id
    ]);
}

有关实体和存储库的一些说明

  

我不理解ArSessionRepository :: getInsurerPaid()方法调用与ArSession之间的关系,在ArSession中,所有实体都与getter和setter一起列出。

实体代表您的模型,这些类不会直接与您的数据库进行交互。

存储库是与数据库交互的类。他们负责对您的数据库执行读/写操作。

您所有的实体存储库都继承自Doctrine\ORM\EntityRepository类,并为您提供了一些与数据库交互的方法(例如findBy()),因此您无需在每次创建实体时都进行重写