Продвинутая фильтрация в фреймворке Laravel

  Рет қаралды 15,397

WebForMySelf

WebForMySelf

Күн бұрын

Разработка веб-приложения на PHP. Посмотрите уроки: webformyself.c...
Исходники к уроку тут: webformyself.c...
Фильтрация элементов повсеместно используется в веб-приложениях, потому как она значительно упрощает процесс поиска необходимой информации. К примеру, в интернет-магазинах на страницах вывода списка товаров, как правило, в правом или левом сайдбаре отображается группа фильтров, которые используются посетителями для фильтрации выбранной из базы данных информации по определенным параметрам. В уроке будет рассмотрен один из вариантов создания системы фильтрации в проекте, написанном с использованием фреймворка Laravel.
Механизм фильтров, который будет рассмотрен в этом уроке, довольно простой в понимании и применении для различных проектов, написанных либо с нуля, либо с использованием фреймворков.
При этом его условно можно разделить на две части. Первая часть - это базовая логика функционала тестирования для конкретной модели, которая будет сосредоточена в трейте BaseSearch. И вторая часть - это непосредственно сами фильтры, каждый из которых будет представлен отдельным классом. Причем, хотел бы отметить, что каждая из указанных частей будет представлять собой реализацию соответствующего интерфейса, а значит будет открыта для различных доработок и расширения функционала.

Пікірлер: 29
@ddrdeveloper
@ddrdeveloper 2 жыл бұрын
Возможно, пример усложнен, но, как минимум, понять работу всей этой конструкции будет полезно. В качестве учебного примера для расширения кругозора - очень даже неплохо!
@nikitaksv
@nikitaksv 4 жыл бұрын
Соре без обид, но этот код никогда не используйте. Усложнено, логика раскидана, лишние интерфейсы, трейт с рефлексией... Лучше обычный билдер сделайте:)
@user-of4dc3rh5c
@user-of4dc3rh5c 4 жыл бұрын
Здравствуйте! Если не нравится подход - не используйте. Билдер и множество If-else или switch это конечно хорошо, но если фильтров много то метод контроллера будет довольно большой. Плюс если будет добавляться новый фильтр, придетьсмя опять же трогать контроллер, а это не хорошо. В моей же реализации если добавляется новый фильтр - Вы просто добавляете новый класс и контроллер не изменяется
@nikitaksv
@nikitaksv 4 жыл бұрын
@@user-of4dc3rh5c В контроллере вообще не должно быть такой логики. Есть специальный scopeFilter, посмотрите его реализацию там все достаточно просто. Вы сделали велосипед, который работает через рефлексию... Фильтрация для модели должна быть всегда явной. Максимум что можно обобщить это цепочку билдера(зависит от ситуации) . Поймите критику верно, попробуйте более элегантное решение и расскажите людям качественную и правильную информацию.
@nikitaksv
@nikitaksv 4 жыл бұрын
@@user-of4dc3rh5c + ещё момент, в качестве аргументов используйте только те данные, которые пригодятся для реализации функции/метода. Например, вы передаёте реквест в методы модели(либо связанные) , а модель вообще не должна ничего знать о транспортном уровне. Только контроллер.
@user-of4dc3rh5c
@user-of4dc3rh5c 4 жыл бұрын
@@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 ]);
@nikitaksv
@nikitaksv 4 жыл бұрын
@@user-of4dc3rh5c мдэ, вы в пример даже велосипед скинули...
@user-kg6fz5tz2b
@user-kg6fz5tz2b 4 жыл бұрын
А я Вас как-то раньше и не смотрел!))А вот сейчас смотрю Ваш курс за 2013 год.Классно объясняете! Спасибо за видео!!
@user-of4dc3rh5c
@user-of4dc3rh5c 4 жыл бұрын
Здравствуйте! Пожалуйста и Вам спасибо!)
@madshox2816
@madshox2816 2 жыл бұрын
Спасибо за видео
@rutorikouman9386
@rutorikouman9386 2 жыл бұрын
Пересматривал 50 раз, все делал, как сказано. Не работает.
@АндрейШуклин-к2з
@АндрейШуклин-к2з 3 жыл бұрын
Супер!
@user-ff1wt1lx8c
@user-ff1wt1lx8c 4 жыл бұрын
будет ли обновленный курс по ларавел?
@user-of4dc3rh5c
@user-of4dc3rh5c 4 жыл бұрын
Здравствуйте! Пока сложно сказать.
@ribllestraip4504
@ribllestraip4504 4 жыл бұрын
@@user-of4dc3rh5c ЖДЕМ ОЧЕНЬ ОЧЕНЬ!
@serg454
@serg454 4 жыл бұрын
@@user-of4dc3rh5c курс по ларке действительно нужен
@lexxkrt
@lexxkrt Жыл бұрын
бесполезно по причине того что фильтры создаваемые известны, их можно и в ручную прописать, как быть с динамическими свойствами, например атрибуты товара, которые разные у разных товаров
@nWoAxMan
@nWoAxMan 4 жыл бұрын
А есть курс по Ларавел ?
@user-ns4iy1bz3v
@user-ns4iy1bz3v 4 жыл бұрын
При всём уважении к Виктору... не делайте так! Не буду критиковать само решение. Есть другие общие моменты. Где PSR-2? Я понимаю, что Eloquent далек от SOLID, но заставлять класс модели выводить список из БД это уже перебор. П.С. Я уже привык к "ретурну" и "сервайсез", но все-таки в наше время пора бы уже подучить английский. )
@user-of4dc3rh5c
@user-of4dc3rh5c 4 жыл бұрын
Здравствуйте! Что касается английского, то согласен, над этим нужно работать. А вот по поводу остального, что тут сказать, если не нравится такой подход не используйте, как было сказано в уроке, это один из способов реализации фильтрации, который я предложил. По поводу PSR-2 - ну собственно урок не по оформлению кода и как бы к этому придираться - ну такое (тем более что материала много и нужно было быстро все осветить). А вот что Вы имели ввиду под этой строкой "но заставлять класс модели выводить список из БД " я так и не понял. Модель возвращает объект Билдера ( return $builder;) , что и где она выводит?? Данные забирает котороллер $users = $user->getUsersBySearch($request)->get(); и собственно отдает в вид.
@maksimchernyshev6587
@maksimchernyshev6587 3 жыл бұрын
вот так реализую поиск в контроллере по имени 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')); }
@golibxayrullayev1353
@golibxayrullayev1353 4 жыл бұрын
Здравствуйте, почему phpstorm)? Vs code не понравился.
@user-of4dc3rh5c
@user-of4dc3rh5c 4 жыл бұрын
Здравствуйте! PHPStorm намного лучше для программирования на PHP чем Vs code. Хотя тут все дело вкуса.
@stabby6521
@stabby6521 3 жыл бұрын
huita
Laravel. Сервисы, контракты и внедрение зависимостей
29:18
Lectoria. Обучение веб-разработке.
Рет қаралды 22 М.
나랑 아빠가 아이스크림 먹을 때
00:15
진영민yeongmin
Рет қаралды 19 МЛН
1ОШБ Да Вінчі навчання
00:14
AIRSOFT BALAN
Рет қаралды 6 МЛН
Laravel API. All you need! Json Resource, Resource Collection, Cache, Rate Limit
21:23
Просто о Laravel. CutCode
Рет қаралды 31 М.
Секретные возможности ORM в Laravel
8:04
Dev Workout
Рет қаралды 12 М.
Делаем фильтры правильно на PHP Laravel
22:51
Vladislav Groniuk
Рет қаралды 14 М.
1. Laravel Query builder - Search Made Easy @freekspatie
11:13
Bitfumes - AI & LLMs
Рет қаралды 35 М.
Как тестировать Laravel?
1:02:47
Pavel Zloi aka EvilFreelancer
Рет қаралды 17 М.
나랑 아빠가 아이스크림 먹을 때
00:15
진영민yeongmin
Рет қаралды 19 МЛН