🏗 Laravel SaaS: как не утонуть в собственном коде через полгода
Дефолтная структура Laravel отлично заходит на старте. Потом приходят мультитенантность, биллинг, сложные правила. В итоге контроллеры пухнут, логика расползается по моделям и джобам.
Рабочий рецепт: модульный монолит с доменной организацией. Каждый домен — мини-приложение внутри приложения.
💡 Правила, которые реально экономят часы на рефакторинге:
— контроллер принимает FormRequest, дёргает сервис, возвращает Resource;
— бизнес-логика живёт в сервисах, чтобы переиспользоваться в API, CLI и очередях;
— доступ к БД — через репозитории, без Booking::where() в сервисах;
— сразу версионируй API (/api/v1), иначе первый же breaking change принесёт боль.
По SaaS-специфике: Sanctum для SPA, Cashier + Stripe для подписок (писать биллинг руками — плохая идея), stancl/tenancy если нужна изоляция тенантов. Тяжёлое отправляем в очереди на Redis, дебаг с Telescope локально и Sentry в проде.
🔗 Читать оригинал
Библиотека пхпшника
#book_code
Дефолтная структура Laravel отлично заходит на старте. Потом приходят мультитенантность, биллинг, сложные правила. В итоге контроллеры пухнут, логика расползается по моделям и джобам.
Рабочий рецепт: модульный монолит с доменной организацией. Каждый домен — мини-приложение внутри приложения.
app/Domains/Bookings/
Models/
Services/
Repositories/
DTOs/
Actions/
Requests/
💡 Правила, которые реально экономят часы на рефакторинге:
— контроллер принимает FormRequest, дёргает сервис, возвращает Resource;
— бизнес-логика живёт в сервисах, чтобы переиспользоваться в API, CLI и очередях;
— доступ к БД — через репозитории, без Booking::where() в сервисах;
— сразу версионируй API (/api/v1), иначе первый же breaking change принесёт боль.
По SaaS-специфике: Sanctum для SPA, Cashier + Stripe для подписок (писать биллинг руками — плохая идея), stancl/tenancy если нужна изоляция тенантов. Тяжёлое отправляем в очереди на Redis, дебаг с Telescope локально и Sentry в проде.
🔗 Читать оригинал
Библиотека пхпшника
#book_code
🔥8👍3❤2😁2👾1