Продвинутая фильтрация в фреймворке Laravel
Вставка
- Опубліковано 20 сер 2024
- Разработка веб-приложения на PHP. Посмотрите уроки: webformyself.c...
Исходники к уроку тут: webformyself.c...
Фильтрация элементов повсеместно используется в веб-приложениях, потому как она значительно упрощает процесс поиска необходимой информации. К примеру, в интернет-магазинах на страницах вывода списка товаров, как правило, в правом или левом сайдбаре отображается группа фильтров, которые используются посетителями для фильтрации выбранной из базы данных информации по определенным параметрам. В уроке будет рассмотрен один из вариантов создания системы фильтрации в проекте, написанном с использованием фреймворка Laravel.
Механизм фильтров, который будет рассмотрен в этом уроке, довольно простой в понимании и применении для различных проектов, написанных либо с нуля, либо с использованием фреймворков.
При этом его условно можно разделить на две части. Первая часть - это базовая логика функционала тестирования для конкретной модели, которая будет сосредоточена в трейте BaseSearch. И вторая часть - это непосредственно сами фильтры, каждый из которых будет представлен отдельным классом. Причем, хотел бы отметить, что каждая из указанных частей будет представлять собой реализацию соответствующего интерфейса, а значит будет открыта для различных доработок и расширения функционала.
Возможно, пример усложнен, но, как минимум, понять работу всей этой конструкции будет полезно. В качестве учебного примера для расширения кругозора - очень даже неплохо!
А я Вас как-то раньше и не смотрел!))А вот сейчас смотрю Ваш курс за 2013 год.Классно объясняете! Спасибо за видео!!
Здравствуйте!
Пожалуйста и Вам спасибо!)
Пересматривал 50 раз, все делал, как сказано. Не работает.
Спасибо за видео
Соре без обид, но этот код никогда не используйте. Усложнено, логика раскидана, лишние интерфейсы, трейт с рефлексией... Лучше обычный билдер сделайте:)
Здравствуйте!
Если не нравится подход - не используйте. Билдер и множество If-else или switch это конечно хорошо, но если фильтров много то метод контроллера будет довольно большой. Плюс если будет добавляться новый фильтр, придетьсмя опять же трогать контроллер, а это не хорошо. В моей же реализации если добавляется новый фильтр - Вы просто добавляете новый класс и контроллер не изменяется
@@user-of4dc3rh5c В контроллере вообще не должно быть такой логики. Есть специальный scopeFilter, посмотрите его реализацию там все достаточно просто. Вы сделали велосипед, который работает через рефлексию... Фильтрация для модели должна быть всегда явной. Максимум что можно обобщить это цепочку билдера(зависит от ситуации) . Поймите критику верно, попробуйте более элегантное решение и расскажите людям качественную и правильную информацию.
@@user-of4dc3rh5c + ещё момент, в качестве аргументов используйте только те данные, которые пригодятся для реализации функции/метода. Например, вы передаёте реквест в методы модели(либо связанные) , а модель вообще не должна ничего знать о транспортном уровне. Только контроллер.
@@nikitaksv начнем с того что в контроллере логики особо никакой нет, там просто строка - вызов метода модели. Вот если бы там было 20- 30 строк кода - тогда вопросов нет - критикуйте. Со scope было бы то же самое, только понятие другое. Нравятся скоупы - используйте - Ваше право. Скоупы нужны как раз для выноса логики выборки информации из контроллеров в модели, в моей реализации, вместо скоупа метод.
Насчет того, что правильно а что нет в программировании как правило это холивар и ни к чему не приведет потому как у каждого свои предпочтения.
То о чем Вы пишите - scoupFilter и возврат билдера я пробовал на многих проектах и это не рационально - по сути это цепочка switch и проверка если есть конкретный фильтр - то добавляем его в where(). И это не удобно, как по мне, когда фильтра увеличиваются - постоянно приходится писать новый case, поэтому я предложил более удобный метод. Повторюсь не нравится не используйте ).
Да, и если Вы считаете что вот такое лучше, ну....
$builder = $this->model;
if($request->has('role_id')) {
$builder = $builder->where('role_id', $request->input('role_id'));
}
if($request->has('name')) {
$builder = $builder->where('name', 'LIKE', '%'.$request->input('name').'%');
}
if($request->has('email')) {
$builder = $builder->where('email', 'LIKE', '%'.$request->input('email').'%');
}
if($request->has('status')) {
$builder = $builder->where('status', (bool)$request->input('status'));
}
$users = $builder->get();
return view('users.index', [
'users' => $users
]);
@@user-of4dc3rh5c мдэ, вы в пример даже велосипед скинули...
Супер!
А есть курс по Ларавел ?
будет ли обновленный курс по ларавел?
Здравствуйте!
Пока сложно сказать.
@@user-of4dc3rh5c ЖДЕМ ОЧЕНЬ ОЧЕНЬ!
@@user-of4dc3rh5c курс по ларке действительно нужен
бесполезно по причине того что фильтры создаваемые известны, их можно и в ручную прописать, как быть с динамическими свойствами, например атрибуты товара, которые разные у разных товаров
При всём уважении к Виктору... не делайте так! Не буду критиковать само решение. Есть другие общие моменты.
Где PSR-2?
Я понимаю, что Eloquent далек от SOLID, но заставлять класс модели выводить список из БД это уже перебор.
П.С. Я уже привык к "ретурну" и "сервайсез", но все-таки в наше время пора бы уже подучить английский. )
Здравствуйте!
Что касается английского, то согласен, над этим нужно работать. А вот по поводу остального, что тут сказать, если не нравится такой подход не используйте, как было сказано в уроке, это один из способов реализации фильтрации, который я предложил.
По поводу PSR-2 - ну собственно урок не по оформлению кода и как бы к этому придираться - ну такое (тем более что материала много и нужно было быстро все осветить).
А вот что Вы имели ввиду под этой строкой "но заставлять класс модели выводить список из БД " я так и не понял. Модель возвращает объект Билдера ( return $builder;) , что и где она выводит?? Данные забирает котороллер $users = $user->getUsersBySearch($request)->get(); и собственно отдает в вид.
вот так реализую поиск в контроллере по имени user-а например:
public function index(Request $request)
{
$users = User::all();
if ($request->search) {
// если в реквесте есть значение по input search
$users = $users->where('name', '%' . $request->search . '%');
// то в переменную users попадают только те значения в которых name = LIKE то что пришло из input search
}
return view('yourview', compact('users'));
}
Здравствуйте, почему phpstorm)? Vs code не понравился.
Здравствуйте!
PHPStorm намного лучше для программирования на PHP чем Vs code.
Хотя тут все дело вкуса.
huita