12. Laravel Actions. Товсті моделі чи товсті контролери? Сервісний шар?

Відео версія
(YouTube - для зворотнього зв'язку)

ВИКОРИСТОВУЙТЕ Action. Для Laravel - Laravel action пакет

Laravel action - абсолютно найкраще рішення, з яким я працював.

Документація повна, я ж лише вкажу декілька порад з особистого досвіду:

  • "Сherry picking" - дозволяє обмежити Action лише тим набором інструментів, який використовується. Це звісно мікрооптимізація, але це полегшує підтримку проєкту. Розробник з великою впевненістю буде розуміти, як використовується Action. Для stub Action рекомендую за замовчуванням встановити трейт "AsController" - він буде зустрічатися найчастіше.
  • Не використовуйте public static function routes(Router $router). На жаль, не кешується. route:cache не працює. І оскільки вона статична, Laravel Octane погано з нею працює.
  • Використовуйте handler як базову функцію. Всі відмінності для кожного з варіантів використання пишіть до специфічних функцій (asController, asJob...).
  • $this->handler - повинен викликатися з усіх специфічних функцій. Якщо це не так, то, скоріш за все, ви впихнули 2 Action в одну.
  • run - зручна функція, але не дозволяє використовувати php8 named parameters. SomeAction::make()->handler() зробить навігацію трохи легшою.
  • runIf, dispatchIf, runUnless, dispatchUnless - зменшують когнітивну складність коду.
  • Laravel Action прекрасно тестуються. Невеличка порада - коли Action простий, достатньо feature тесту. Коли він складний, в feature тестах тестуйте лише доступи та формат відповідей, а сам ActionHandler - тестуйте unit тестами.
  • AsFake - дуже допомагає при тестуванні ActionAsObject. Окремо протестуйте ActionAsObject, і просто викликайте її мок в Actions, де використовуються. Перевіряйте shouldRun, shouldNotRun. Перевіряйте вхідні параметри shouldRun->with. Та мокайте результат shouldRun->andReturn.
  • Валідацію краще винести до FormRequest. Це і зменшить код, і дозволить нормально перевикористовувати FormRequest.
  • WithAttributes трейт робить код складнішим. Краще на повну використовувати php8 named parameters. І, звісно ж, запускати валідацію на параметри, які самі ж задаємо в метод, не дуже продуктивно.
  • Одна дія - один Action. Не плодіть шари коду, не плодіть патерни, не плодіть сервіси. Action покриє абсолютну більшість ваших запитів.
  • Action - ідеальний для взаємодії між модулями. У випадку винесення модуля до сервісу - Action просто почне викликати код з сервісу.