了解 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()
),因此您无需重写每次创建实体时它。
我正在尝试为 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()
),因此您无需重写每次创建实体时它。