Решений было несколько: фабрика/сеттер модели/отказаться от инстанцирования модели в конструкторе(передача id в методах)/отказаться от слабой связности.
В итоге сделал повторное присваивание модели для всех репозиториев на все возвращающие модель методы репозитория.
/** Псевдокод **/
public function findBySlug($slug): Product
{
$product = $this->model->where('slug', $slug)->first();
$this->model = $product;
1. Пакет как и код не мой, там много всяких странных решений, пока ищу как исправить нелогичность с вызовом.
2. Первая мысль тоже была изменить вызов на фабричный но к своему удивлению так и не нашел как заменить просто связь на фабричную.
Решений было несколько: фабрика/сеттер модели/отказаться от инстанцирования модели в конструкторе(передача id в методах)/отказаться от слабой связности.
В итоге сделал повторное присваивание модели для всех репозиториев на все возвращающие модель методы репозитория.
/** Псевдокод **/
public function findBySlug($slug): Product
{
$product = $this->model->where('slug', $slug)->first();
$this->model = $product;
return $product;
}
Максим Федоров, я так понимаю для ослабления связности все подключения репозиториев делаються через интерфейсы, но также в коде встречаются прямые вызовы для использования репозиториев с заданной моделью.
Также смущают вызовы репозиториев в репозиториях, опять же напрямую без использования интерфейса.
Насколько я понимаю вариант использования интерфейсов для связывания должен исключать подобные вызовы.
Также в процессе поиска примеров в интернете, чаще встречал простую реализацию где для работы с моделью в метод репозитория передается её id .
В вариантах с ларавел репозитории в примерах указывались явно.
Хотелось бы иметь возможность исправить ситуацию с прямым вызовом (иначе зачем биндинг репозиториев с интерфейсами) в конкретном случае с сеттингом модели в репозиторий.
То есть задать модель в примере как здесь app/Shop/Orders/Repositories/OrderRepository.php указав лишь интерфейс
То есть в метод должен быть передан объект класса реализующего данный интерфейс?
Теорию плохо на слух понимаю, если можно практический пример применения
В итоге сделал повторное присваивание модели для всех репозиториев на все возвращающие модель методы репозитория.
/** Псевдокод **/
public function findBySlug($slug): Product
{
$product = $this->model->where('slug', $slug)->first();
$this->model = $product;
return $product;
}