Выборка данных и правило единственной ответственности 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() }}
Так же вы можете оформить этот функционал как компонент, который будет отвечать и за сам рендер вьюшки. Чтобы контроллер про него вообще ничего не знал. Почитайте подробнее про компоненты в Ларавеле.