Выборка данных и правило единственной ответственности Laravel 8

У меня есть контроллер для продуктов. И на одной странице у меня выводятся подкатегории и карточки продуктов относящиеся к ним. Но как правильно написать выборку, слышал что надо следовать правилу единственной ответственности и не перегружать контроллер более чем 1 выборкой, а как иначе сделать?

К тому же в карточке есть пункт количество отзывов и комментариев, а оно будет выводиться с другой таблицы, получается как минимум 3 выборки в одном пункте контроллера?

А эта инфа выводится на главную страницу в "Лидеры продаж", в категории и в самой карточке конкретного товара.

   public function categories($code){
   $categories = Category::where('code', $code)->get();
   $proditem = Product::get();
   return view('categories', compact('categories','proditem'));
 }

А если сделать в другом контроллере, то как передать переменную в эту же view?

Заранее спасибо!


Ответы (1 шт):

Автор решения: Вадим Александру

Действительно не стоит перегружать контроллер логикой выборки из базы.

У вас куча вариантов решений, к примеру через репозиторий. Создадим класс ProductRepository который будет отвечать за логику выборки из базы. К примеру

class ProductRepository
{


  private $code;


  /**
   * @param mixed $code
   */
  public function setCode($code): void
  {
    $this->code = $code;
  }


  public function getCategories()
  {
    return Category::query()->where('code', $this->code);
  }


  public function getProduct()
  {
    return Product::get();
  }

}

Метод контроллера

  public function index(Request $request, ProductRepository $productRepository)
  {
    
    $productRepository->setCode($request->get('code'));
    
    return view('categories', [
      'repository' => $productRepository
    ]);
  }

В самой вьюшке уже обращаемся за данными в репозиторий,

cat count{{ $productRepository->getCategories()->count() }}

Так же вы можете оформить этот функционал как компонент, который будет отвечать и за сам рендер вьюшки. Чтобы контроллер про него вообще ничего не знал. Почитайте подробнее про компоненты в Ларавеле.

→ Ссылка