Одинаковые функции
Скажите, например, есть две функции. Первая на отображение каталога товаров по URL(ЧПУ catalog/category1), а вторая на вывод всех товаров без разбору(catalog). Можно ли как то ограничится одной функцией, чтобы не писать вторую такую же. Просто может быть такое, что кода будет много всякого, где куча переменных для фильтрации запроса и т.д. а дублировать код не хочется.
Route::get('/catalog', [ CatalogController::class, 'catalogAll' ])->name('catalogAll');
Route::get('/catalog/{url}', [ CatalogController::class, 'catalog' ])->name('catalog');
class CatalogController extends Controller
{
protected $post_per_page = 9;
public function catalog(Request $request, $url){
$url = $request->url;
$posts = DB::table('catalog')
->where('url','=', $url)
->paginate($this->post_per_page);
return view('pages/catalog')->with(compact('posts'));
}
public function catalogAll(Request $request){
$posts = DB::table('catalog')
->paginate($this->post_per_page);
return view('pages/catalog')->with(compact('posts'));
}
}
Ответы (1 шт):
Можно. Создавайте в модели метод filters, и у него в зависимости от принимаемых фильтров уже применяйте запрос.
Будет ещё лучше, если этот фильтр положить в BaseModel, а от неё уже наследовать остальные.
protected $filter_fields = ['field1', 'field2']; // Разрешаем фильтровать только эти поля
public static function filters($request)
{
$self = new static;
$query = Self::query();
if( isset($request->filter) ) {
foreach($request->filter as $field => $value) {
if ($field === array_key_first($self->filter_fields)) {
$query->where($field, "=", $value);
continue;
}
$query->orWhere($field, "=", $value);
}
}
return $query;
}
В запросе тогда фильтры пойдут через параметры в GET ?filter[field1]&filter[field2]=Test2 или получаемый массив filter в payload через POST.
ВАЖНО! Должна быть модель, а не хелпер DB (это вообще не очень хорошая практика использовать DB::table()).