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

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

КОМЕНТАРІ • 29

  • @ddrdeveloper
    @ddrdeveloper 2 роки тому +2

    Возможно, пример усложнен, но, как минимум, понять работу всей этой конструкции будет полезно. В качестве учебного примера для расширения кругозора - очень даже неплохо!

  • @user-kg6fz5tz2b
    @user-kg6fz5tz2b 4 роки тому +2

    А я Вас как-то раньше и не смотрел!))А вот сейчас смотрю Ваш курс за 2013 год.Классно объясняете! Спасибо за видео!!

    • @user-of4dc3rh5c
      @user-of4dc3rh5c 4 роки тому

      Здравствуйте!
      Пожалуйста и Вам спасибо!)

  • @rutorikouman9386
    @rutorikouman9386 2 роки тому +2

    Пересматривал 50 раз, все делал, как сказано. Не работает.

  • @madshox2816
    @madshox2816 2 роки тому

    Спасибо за видео

  • @nikitaksv
    @nikitaksv 4 роки тому +21

    Соре без обид, но этот код никогда не используйте. Усложнено, логика раскидана, лишние интерфейсы, трейт с рефлексией... Лучше обычный билдер сделайте:)

    • @user-of4dc3rh5c
      @user-of4dc3rh5c 4 роки тому +1

      Здравствуйте!
      Если не нравится подход - не используйте. Билдер и множество If-else или switch это конечно хорошо, но если фильтров много то метод контроллера будет довольно большой. Плюс если будет добавляться новый фильтр, придетьсмя опять же трогать контроллер, а это не хорошо. В моей же реализации если добавляется новый фильтр - Вы просто добавляете новый класс и контроллер не изменяется

    • @nikitaksv
      @nikitaksv 4 роки тому +5

      @@user-of4dc3rh5c В контроллере вообще не должно быть такой логики. Есть специальный scopeFilter, посмотрите его реализацию там все достаточно просто. Вы сделали велосипед, который работает через рефлексию... Фильтрация для модели должна быть всегда явной. Максимум что можно обобщить это цепочку билдера(зависит от ситуации) . Поймите критику верно, попробуйте более элегантное решение и расскажите людям качественную и правильную информацию.

    • @nikitaksv
      @nikitaksv 4 роки тому +3

      @@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 роки тому +3

      @@user-of4dc3rh5c мдэ, вы в пример даже велосипед скинули...

  • @user-cv2dq9bt6h
    @user-cv2dq9bt6h 3 роки тому

    Супер!

  • @nWoAxMan
    @nWoAxMan 4 роки тому +1

    А есть курс по Ларавел ?

  • @user-ff1wt1lx8c
    @user-ff1wt1lx8c 4 роки тому +3

    будет ли обновленный курс по ларавел?

    • @user-of4dc3rh5c
      @user-of4dc3rh5c 4 роки тому

      Здравствуйте!
      Пока сложно сказать.

    • @ribllestraip4504
      @ribllestraip4504 4 роки тому +1

      @@user-of4dc3rh5c ЖДЕМ ОЧЕНЬ ОЧЕНЬ!

    • @serg454
      @serg454 4 роки тому +1

      @@user-of4dc3rh5c курс по ларке действительно нужен

  • @lexxkrt
    @lexxkrt Рік тому

    бесполезно по причине того что фильтры создаваемые известны, их можно и в ручную прописать, как быть с динамическими свойствами, например атрибуты товара, которые разные у разных товаров

  • @user-ns4iy1bz3v
    @user-ns4iy1bz3v 4 роки тому +1

    При всём уважении к Виктору... не делайте так! Не буду критиковать само решение. Есть другие общие моменты.
    Где PSR-2?
    Я понимаю, что Eloquent далек от SOLID, но заставлять класс модели выводить список из БД это уже перебор.
    П.С. Я уже привык к "ретурну" и "сервайсез", но все-таки в наше время пора бы уже подучить английский. )

    • @user-of4dc3rh5c
      @user-of4dc3rh5c 4 роки тому +2

      Здравствуйте!
      Что касается английского, то согласен, над этим нужно работать. А вот по поводу остального, что тут сказать, если не нравится такой подход не используйте, как было сказано в уроке, это один из способов реализации фильтрации, который я предложил.
      По поводу 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 роки тому +5

      Здравствуйте!
      PHPStorm намного лучше для программирования на PHP чем Vs code.
      Хотя тут все дело вкуса.

  • @stabby6521
    @stabby6521 3 роки тому +2

    huita