У меня есть модель Eloquent, Person, которая имеет следующую функцию
public function findRecordByIdm($idm)
{
$record = Person::find($idm);
return $record;
}
В отдельном контроллере, ProspectController, я хочу вызвать эту функцию, чтобы получить запись Person, возвращаемую $ idm. Если я сделаю это, не объявив его статическим методом, я получу
non static method should not be called statically
Я знаю, что из-за сложности тестирования мне не следует просто объявлять метод статическим. Как вместо этого сделать эту функцию доступной из ProspectController?






Find - это не метод модели, это фактически метод экземпляра класса Builder. Из-за определения Model::__callStatic, Model::find (или любой другой несуществующий метод) передается новому экземпляру класса Builder. Это единственная причина, по которой вы можете вызывать find как статически, так и нестатически, потому что Model::find на самом деле не существует.
Вы можете использовать экземпляр модели, как предлагает u_mulder, но это тот случай, когда я бы сказал, что статический метод подойдет. Это соответствует дизайну, аналогичному шаблону фабрики, где весь смысл этого статического метода состоит в том, чтобы подготовить и вернуть экземпляр модели.
Этот вопрос определенно вызовет разные мнения, поскольку все мы отдаем предпочтение одному шаблону над другим, но, следуя пути Laravel, вы должны делать это в своем контроллере, а не в своей модели. В ProspectController.php
public function findRecordByIdm($idm)
{
$record = Person::find($idm);
return $record;
}
Если вы собираетесь повторно использовать функцию в разных местах, вам следует подумать об использовании служб и репозиториев ...
Почему в контроллере над моделью? Модель или репозиторий определенно кажутся подходящим местом для этого.
@Devon ... У разных людей определенно будут разные мнения по этому поводу ... но если мы идем по пути Laravel, это определенно метод controller ...
(new Person())->findRecordByIdm()