🏗 Что это
Этот скилл — сборник production-ready паттернов для Laravel, которые помогают строить масштабируемые и поддерживаемые приложения. Он охватывает типовую структуру проекта, разделение ответственности (контроллеры → сервисы → действия), работу с Eloquent (модели, скоупы, касты), API-ресурсы, очереди, события, кеширование и best practices для роутинга и валидации.
⚙ Как работает
🧱 Структура проекта
Рекомендуется разделять код на чёткие слои: HTTP (контроллеры, Middleware, Form Requests, API Resources), Services, Actions, Models, Jobs, Events и т.д. Пример базовой структуры:
app/
├── Actions/ # одноцелевые use case
├── Http/
│ ├── Controllers/
│ ├── Requests/
│ └── Resources/
├── Services/ # оркестрация
├── Models/
└── ...
config/
database/
🎯 Контроллер → Сервис → Action
Контроллеры остаются тонкими — они только принимают запрос, вызывают сервис/action и возвращают ответ. Сервис координирует несколько действий, а Action — единичная операция (например, "создать заказ").
// Action
final class CreateOrderAction {
public function __construct(private OrderRepository $orders) {}
public function handle(CreateOrderData $data): Order {
return $this->orders->create($data);
}
}
// Контроллер
final class OrdersController extends Controller {
public function store(StoreOrderRequest $request): JsonResponse {
$order = $this->createOrder->handle($request->toDto());
return response()->json([...], 201);
}
}
🚦 Роутинг и привязка моделей
- Используются
apiResource и scopeBindings для автоматической привязки моделей и предотвращения доступа одного тенанта к данным другого.
- Имена параметров (
{conversation}) должны совпадать с именем модели.
- Если нужна кастомная привязка —
Route::model() или resolveRouteBinding().
🗄 Eloquent: модели, касты, скоупы
- Модели:
$fillable, $casts (включая Enum и Value Object), отношения.
- Скоупы: именованные (
scopeActive) или глобальные (в booted).
- Частое использование
SoftDeletes для мягкого удаления.
- Запросы пагинируются с
with() для избежания N+1.
- Для сложной фильтрации — отдельный Query-объект, клонирующий билдер.
✅ Форм-реквесты и DTO
Валидация выносится в отдельные классы FormRequest, которые также могут возвращать DTO (toDto()). Это улучшает переиспользуемость и тестируемость.
📡 API-ресурсы
Используются Resource и Resource::collection для единого формата ответа: {success, data, error, meta}. Пагинация передаётся через meta (page, per_page, total).
🕒 События, Jobs, Кеш
- События — для побочных эффектов (уведомления, аналитика).
- Jobs — для тяжёлой работы (отчёты, вебхуки).
- Кеш — для read-heavy запросов; инвалидация по событиям модели.
⚙ Конфигурация
- Секреты в
.env, остальное в config/*.php.
- Использовать
config:cache на продакшене.
🔍 Когда использовать
- Когда нужно построить новое Laravel-приложение с нуля и сразу заложить архитектуру, которая не развалится при росте.
- Если в проекте уже есть хаотичная структура — паттерны помогут рефакторить постепенно.
- Для API, где важна консистентность ответов и лёгкая поддержка.
💡 Важно знать
- Не следуйте слепо — паттерны нужно адаптировать под конкретную задачу. Например, для простого CRUD можно обойтись без отдельного Action.
- Избегайте преждевременной абстракции — начинайте с контроллера и выносите логику только когда она повторяется или усложняется.
- Очереди и события — используйте для асинхронных задач, но не злоупотребляйте: каждая очередь — дополнительная точка отказа.
- Кеш — всегда продумывайте стратегию инвалидации, иначе данные устареют.
- Формальные запросы — отлично, но не смешивайте валидацию с бизнес-логикой.
Этот скилл — не жёсткий стандарт, а набор проверенных практик, которые помогут команде говорить на одном языке и быстрее вводить новичков в курс дела.
Комментарии
Комментариев пока нет. Будьте первым.