Стандартна структура Laravel групує код за технічним типом: усі контролери в Http/Controllers, усі моделі в Models. У великому застосунку зміна однієї функції (наприклад, оплати) зачіпає десяток папок, а межі між частинами системи не видно.
Модульний моноліт групує код за предметними областями, лишаючись одним застосунком з одним деплоєм:
app/
Modules/
Billing/
Actions/ Models/ Http/ Events/ Listeners/ Jobs/
BillingServiceProvider.php
routes.php
Catalog/
Orders/
Shared/ ← спільні об'єкти-значення, базові класи
Кожен модуль:
- має власний сервіс-провайдер, що реєструє маршрути, слухачі, прив'язки в контейнері, міграції (
loadMigrationsFrom), конфігурацію; - володіє своїми таблицями - інші модулі не пишуть у них напряму;
- має публічний інтерфейс - action-класи, контракти, події, DTO, - а все інше вважається внутрішнім.
Як модулі взаємодіють:
- виклик публічного контракту:
OrdersвикликаєBilling\Contracts\ChargesCustomers, а не лізе в моделіBilling; - події:
OrdersпублікуєOrderPlaced,BillingіInventoryпідписуються - без прямої залежності; - ідентифікатори замість моделей на межах: модуль передає
customerId, а не модельCustomerз іншого модуля.
Як утримати межі - найскладніша частина:
- архітектурні тести (Pest
arch()): «код зModules\Catalogне використовуєModules\Billing\Models»; - зв'язки Eloquent між модулями - найчастіший спосіб непомітно зламати межі. Їх обмежують чи замінюють запитами через публічний інтерфейс модуля;
- рев'ю коду з увагою до нових залежностей між модулями.
Переваги перед мікросервісами: один деплой, одна база (з логічним розділенням), транзакції без розподілених протоколів, простий рефакторинг. А модуль з чіткими межами можна винести в окремий сервіс пізніше - коли з'явиться реальна причина.
Коли це потрібно: великий застосунок, кілька команд, складна предметна область. Для невеликого проєкту стандартна структура Laravel простіша і зрозуміліша будь-якому новому розробнику.
Інструменти: пакети на кшталт nwidart/laravel-modules чи internachi/modular дають генератори й автозавантаження модулів, але суть - у дисципліні меж, а не в структурі папок.