Куда вынести логику из controllers, commands, jobs. Лучшие практики Laravel разработчиков

Поділитися
Вставка
  • Опубліковано 7 січ 2025

КОМЕНТАРІ • 86

  • @СергейПрозоров-ч5к

    Спасибо огромное, раньше не понимал чем отличается экшены от сервисов, почему кто то использует одно а кто то другое

  • @devvv747
    @devvv747 2 роки тому +4

    Очень большое спасибо з информативное видео и Ваш труд! Один из самых информативных каналов по laravel в ютубе!

    • @CutCodeRu
      @CutCodeRu  2 роки тому +1

      Благодарю, стараюсь!

  • @rpy6ocTb
    @rpy6ocTb 2 роки тому +7

    Ох, хулиган =) по консольным командам тоже хотелось бы видео. Видео с тестами очень ждем!

  • @sovrinfo
    @sovrinfo 2 роки тому +1

    Спасибо за видео. Коммент в поддержку!

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

    Видео заставило задуматься. Спасибо.

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

      Какие мысли породило?)

    • @levdau
      @levdau 2 роки тому +1

      @@CutCodeRu Прежде всего о нахождении баланса между непосредственно выполнением задачи бизнес логики и наведением порядка, через повышение степени абстракции.

  • @КоролеваЗамков
    @КоролеваЗамков 2 роки тому +5

    Очень полезный и интересный ролик получился! Спасибо! И тоже жду гайд по тестам)))🙂

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

      Спасибо, сам жду)

  • @ev_geniy17
    @ev_geniy17 2 роки тому +7

    Очень похоже на porto, только без tasks, тут главное добавить правило что action не может вызывать другой action, дублирующую логику выносить на уровень тасков, иначе можно получить колбекхелл когда action вызывает др. Action, тот следующий и т. Д. Ещё я бы добавил, что action должен содержать бизнес логику и не иметь прямых зависимостей, а такие вещи как хранение, транспорт и отображение нужно выносить в соответствующие слои

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

    Спасибо, очень интересный ролик)

  • @Робот-ю1к
    @Робот-ю1к Рік тому +1

    Крутой канал, кайфую прям

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

      Приятного просмотра!

  • @SemyonF89
    @SemyonF89 10 місяців тому

    Очень благодарен вам!

  • @gigavaxer6557
    @gigavaxer6557 2 роки тому +1

    Спасибо. Интересный материал и очень полезный. И о трейтах было бы интересно.

  • @artem-web-developer
    @artem-web-developer Рік тому +1

    Почитал коменты), где писали что повествование жесть, как по мне в целом все понятно объяснил, или выносим в папку actions, или в services(я так кстати и делаю), мне больше нравится логику в одном классе писать, ну само собой там не 2 тысячи строк в одном классе)) или в трейты, трейты используем только в том случае, когда будем этот трейты где-то ещё переиспользовать

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

      спасибо за мнение!

  • @0kkama
    @0kkama 2 роки тому +1

    6:44 Поддерживаю/реквестирую

  • @Heyb111
    @Heyb111 2 роки тому +14

    Информативно, но как по мне в больших проектах где много бизнес логики сложно найти место где можно лаконично использовать экшин класс и чтоб он был красивым и маленьким как на видео,. Писать 10 экшин классов вместо 1-2 классов по 5 методов не самый лучший подход

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

      Нужно варьировать, иногда отличное решение но не панацея

  • @asxenonify
    @asxenonify Рік тому +2

    Такой подход хорошо использовать в небольших проектах. Было бы здорово увидеть видео про DDD и Porto. К примеру в Yii 2 Есть возможность скомпоновать логику в модули, а не разбрасывать всё по папкам. Жалко, что в Laravel из коробки такого нет.

    • @fredmorrison7513
      @fredmorrison7513 8 місяців тому

      Что мешает скомпоновать логику в модули на Laravel?)

    • @asxenonify
      @asxenonify 8 місяців тому

      @@fredmorrison7513 вот хотелось бы посмотреть как это делается, желательно на русском.

  • @PostScripton
    @PostScripton Рік тому +2

    Почему бы не хранить взаимодействие с другими сервисами в директории Clients?
    Тогда там будут находиться чисто классы, содержащие Guzzle клиенты и удобную обёртку над внешним API.
    Потом всю бизнес-логику, связанную с этим внешним сервисом можно использовать в классе, который будет находиться в директории Services.
    И тогда в конструкторе сервиса ты пропишешь что-то вроде: $this->client = new VimeoClient($apiToken); и вызываешь удобные методы, которые ты сам описал.
    Т.е. Clients - для клиентов к внешним API, а Services / Managers - для бизнес-логики.
    Я согласен с комментом, где чел сказал, что создавать 10 классов для сложной бизнес-логики не так красиво будет, поэтому используются Services / Managers.

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

      еще провайдера в DI и вообще красота как например в codeigntaer можно написать Services::vimeoClient($apiToken); или и того лучше получять $apiToken на уровне самого провайдера или еще веселее передать return new VimeoClient($apiToken) и вызывать уже Services::vimeoClient();
      Ну или еще проще всё в томже провайдере
      $vimeoClient = new VimeoClient(new Guzzle(), ... )
      $vimeoClient->setApiToken($apiToken);
      return $vimeoClient;
      Вариантов массов согласен с тобой как обойти более красиво этот момент через сервисы....

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

    То что нужно, спасибо!

  • @mnogokotin
    @mnogokotin 2 роки тому +1

    спасибо за видос ) + за трейты

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

    проблема экшн классов еще и в том что обычно логику экшена приходится разбивать на несколько функций. а эти функции бывают нужны и в других экшенах.
    в итоге получаем что экшен класс по большей части свою работу будет выполнять в сервис классах.
    у меня сервисы тоже обычно это коннекторы к разным апи. а бизнес логика в *Manager классах.

    • @НиколайШи-с9о
      @НиколайШи-с9о 2 роки тому

      В экшен классе должен быть только один метод, в твоём случае он слишком жирный и ты должен использовать экшен а не метод в другом экшене

  • @silentage6310
    @silentage6310 2 роки тому +8

    написал длинный коммент про то как надо бы делать, но нажал случайно какую то кнопку и весь текст пропал.
    в общем, буду краток, неплохо было на вход/выход еще DTO передавать. т.к. в будущем могут появится разные внешние интерефейсы (апи для моб приложения, для клиентов, чат боты и тд).

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

      Согласен но урок немного не об этом, слишком бы раздулся

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

      @@CutCodeRu а можно урок по DTO (когда зачем как и почему)?

    • @CutCodeRu
      @CutCodeRu  2 роки тому +1

      @@dimagudkov2697 есть такой, ищите на канале

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

    8:34 assertEquals должен быть не $user, a $user->email

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

      Да, конечно! Это набросок, не заметил

  • @burtreynolds6305
    @burtreynolds6305 3 місяці тому

    Это phpstorm? Можно ссылку на тему?

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

    Использую DTO для передачи данных, вместо непонятного array $data

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

    Подскажите, что за тема для phpstorm используется?

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

    Где по вашему мнению должна располагаться валидация входных параметров для экшна? (сразу отсеку вариант с FormReaquest т.к. экшн может вызываться откуда угодно, из команды например)

    • @LifestarTV
      @LifestarTV 2 роки тому +1

      Можно использовать пакет spatie/laravel-data и передавать в экшн объект Data (создавая его методом Data::validate)

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

      @@LifestarTV Вы правы за исключением того что для этого не нужно использовать пакет. А также того что это компромисс между тем как действительно надо и реальностью. Поэтому очень бы хотелось увидеть ответ CutCode

    • @НиколайШи-с9о
      @НиколайШи-с9о 2 роки тому +2

      Влидация должна быть "с наружи". По умолчанию для всех экшенов считаем что пришли корректные данные

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

      Вне экшена

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

      @@НиколайШи-с9о Почему? не поделитесь источником?

  • @сергейерохов-и3н
    @сергейерохов-и3н 2 роки тому +1

    Вопрос не связанный с видео
    Как мне в ларавел отсортировать нужное количество товаров к примеру.
    Есть 100 товаров мне у них есть вип статус и мне нужно отсортировать волшебным образом по вип статусу. Чтоб первые 5 товаров были с вип статусов потом 10 обычных товаров потом 5 с вип статусом и так далее)

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

      Что мешает сделать три отдельных запроса к БД со своими сортировками ?

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

      если хотите быстро получать помощь - пишите сюда - t.me/laravel_chat

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

    Без нормальной модульности из коробки, это все равно каша. Представляю какой кайф заходить в папку Actions и видеть там пару сотен файлов, красота.

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

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

  • @twentxx
    @twentxx 2 роки тому +1

    ♥️👍

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

    Спасибо, интересно! Только я не понял, зачем делать интерфейсы к экшн хендлерам? У меня, например, экшн классов много и все имеют разные аргументы.
    Или тут имеется ввиду, что для каждого экшн класса надо писать свой интерфейс? Если так, что смысл? Забиндить можно же не только интерфейс, но и сам класс, или я что-то не понимаю)

    • @CutCodeRu
      @CutCodeRu  Рік тому +1

      Только для там где есть вероятность изменения реализации, для дальнейшей гибкости

  • @ЮрийПлохов-к2в
    @ЮрийПлохов-к2в 2 роки тому

    В итоге, если используешь экшен классы, в контроллерах ветвления вообще не бывает?

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

      Все бывает, зависит от реализации

  • @pryanik150
    @pryanik150 2 роки тому +1

    Repositories не популярны?

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

      В laravel нет

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

      @@CutCodeRu хотя даже в документации они упоминаются

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

      @@pryanik150 наверно путаете с resources

    • @ДенисКуликов-м3о
      @ДенисКуликов-м3о 2 роки тому +1

      @@CutCodeRu раздела конечно нет про них
      Но в примерах кода упоминаются

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

      @@ДенисКуликов-м3о действительно упоминают в примерах кода, а так же на laracast, но конкретных примеров реализации нет. На практике паттерн repository использовать с eloquent не самая лучшая идея. Мы на проекте получили только лишний слой абстракции, теперь убираем все это. Если интересно можете на хабре найти минимум две статьи про то как это можно сделать, почему не стоит, и почему это все же не repository.

  • @shvoraq
    @shvoraq 2 роки тому +1

    Зачем придумывать велосипед ? ( ViewModel ) Используйте доктрину

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

    Для чего нужна эта привязка контракта к action? ведь зачастую в action реализуется один метод __invoke, в таком случае создание контракта(интерфейса) с одним методом это ведь излишне

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

      Когда условно контракт для какого-нибудь сервиса или фабрики твоей, более логичен и востребован, и там можно можно уже применить эту привязку, и для чего вообще стоит указывать контракт вместо самого сервиса или фабрики? чем это помогает вообще при разработке?

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

      Гибкостью и подстановкой

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

      @@CutCodeRu Спасибо за ответ! А зачем эта гибкость в actions ? которые реализуют один метод по сути invoke

    • @m.kohone
      @m.kohone 2 роки тому +1

      @@coopsprofi8617 в случае написания нового action класса можно будет одном месте в сервис провайдере внести изменения, а не бегать по десятку контроллеров и править в них.

  • @toyly2820
    @toyly2820 3 місяці тому

    Не слово про repository хотя документация ларавел продвигает его в своих примерах.

  • @АлександрКудряшкин-е2ц

    Что за тема php storm ?

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

    Кране непоследовательное изложение. Ужас. Сначала говорим, что трейты - плохая идея, хотите трейты - пищите в комменты, и тут же как создать трейт. ДЛЯ ЧЕГО ТАКОЕ ЗАПУТЫВАНИЕ? При том реально не ответил на вопрос - куда переносить логику - ушел в треты. Начало видоса тож сумбурное - ну экшены... но хоть бы абзац - для чего они нужны. такое чувство, что делаешь рекламный проморолик для будущих видосов. А как обучающий - этот видос гавно

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

    повествование у тебя просто жесть, учись как то развивать мысль или делать заставки в нужных местах на 4-й минуте подумал что ты уже ролик закончил.