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 просто почне викликати код з сервісу.