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