了解 PHP 致命类型错误 "must be an instance of" 学说 symfony 组件项目

Understanding PHP Fatal TypeError "must be an instance of" doctrine symfony component project

我正在尝试为 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 一起列出的地方。我希望有人可以解释 "must be an instance of" 错误消息。

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

https://github.com/juggernautsei/symfony_twig_doctrine_component

更新:

Nico Haase 是对的,它真的很简单,与 Doctrine 或 Symfony 无关。一旦我改变了这个

getInsurerPaid(ArSession $payer_id)

到此。我试图遵循其他人的代码,这就是我将其放在那里的原因。

getInsurerPaid($payer_id)

一切都像预期的那样工作。错误消失,查询完成。查看 Github.

上更新的存储库

关于你的错误

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() 应该 return 来自 id 的 ArSession 对象,因此您不必要求提供一个 ArSession 对象。

关于您的存储库方法

如果您想从您的存储库中检索单行,您应该使用 findOneBy() 方法,因为它会 return 您的对象(如果已创建),否则 null

如果您想要检索 多个 行,并且 return 您有 array 个对象,findBy() 方法很有用。

更新存储库方法

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

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

I don't understand the relationship between the ArSessionRepository::getInsurerPaid() method call and ArSession which is where all the entities are listed with the getters and setters.

Entities 代表您的模型,那些 classes 不直接与您的数据库交互。

存储库 是与您的数据库交互的classes。他们负责对您的数据库执行 read/write 操作。

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