AppServiceProvider - зручне місце за замовчуванням, і для невеликого застосунку його цілком досить. Проблема починається, коли він розростається до сотень рядків змішаних налаштувань.
Ознаки, що час розділяти:
- у
boot()упереміш макроси, правилаModel::shouldBeStrict(),RateLimiter::for(),Gate::before(),Event::listen()і прив'язки інтеграцій; - щоб змінити одну інтеграцію, доводиться гортати весь файл;
- різні частини належать різним модулям чи командам.
Як розділяють: за предметною областю, а не за типом коду.
// bootstrap/providers.php
return [
App\Providers\AppServiceProvider::class, // загальні налаштування фреймворку
App\Providers\BillingServiceProvider::class, // усе про оплату: шлюз, вебхуки, лімітери
App\Providers\SearchServiceProvider::class, // клієнт пошуку, індексатори
];
Провайдер модуля тримає прив'язки, події й політики свого модуля - тоді модуль можна зрозуміти, відкривши один файл.
Чого уникати:
- провайдер на кожен рядок - десяток порожніх класів гірший за один охайний файл;
- важкої роботи в
boot()- він виконується на кожен запит, тож запит до бази чи HTTP-виклик там гальмує все; - залежності від порядку провайдерів у
register(): там можна лише реєструвати, а користуватися сервісами - уboot().
Провайдер, що лише реєструє прив'язки, можна зробити відкладеним (DeferrableProvider).