Понимание PHP Fatal TypeError "должно быть экземпляром" Doctrine Symfony Component Project - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь заложить основы для отчета в 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, в котором все сущности перечислены с помощью методов получения и установки. Я надеюсь, что кто-то может объяснить «должен быть экземпляр» сообщения об ошибке.

Потому что сейчас я думаю, что -> findBy (массив) должен быть методом внутри ArSession, даже если я пытаюсь использовать встроенный в доктрину метод findBy (массив). Весь код проекта находится здесь

https://github.com/juggernautsei/symfony_twig_doctrine_component

ОБНОВЛЕНИЕ:

Нико Хаас был прав, он был действительно прост и не имел отношения к Доктринеили Symfony. Как только я изменил это

getInsurerPaid(ArSession $payer_id)

на это. Я пытался следовать чужому коду, поэтому я поместил его туда.

getInsurerPaid($payer_id)

Все работало так, как должно было работать. Ошибка исчезла и запрос завершен. Ознакомьтесь с обновленным репо на Github.

1 Ответ

3 голосов
/ 07 ноября 2019

О вашей ошибке

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() должен вернуть 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, где все сущности перечислены с помощью методов получения и установки.

Entities представляет ваши модели, эти классы невзаимодействовать напрямую с вашей базой данных.

Репозитории - это классы, взаимодействующие с вашей базой данных. Они отвечают за выполнение операций чтения / записи в вашей базе данных.

Все ваши репозитории сущностей наследуются от класса Doctrine\ORM\EntityRepository и предоставляют вам несколько методов для взаимодействия с вашей БД (например, findBy()), чтобы вы моглине нужно переписывать его каждый раз, когда вы создаете сущность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...