Модульная структура Laravel по FSD

от автора

в
Время чтения: 2 мин.

Модульная структура для Laravel приложения, вдохновленная Feature Sliced Design (FSD), может быть организована следующим образом. FSD предлагает разделять приложение на слои и слайсы (фичи), что позволяет улучшить читаемость, поддерживаемость и масштабируемость кода. В контексте Laravel это можно адаптировать, используя модульный подход.

Основные принципы:

  1. Слои (Layers):
    • App — ядро приложения, общие компоненты.
    • Features — функциональные слайсы (фичи).
    • Shared — общие ресурсы, используемые между фичами.
    • Infrastructure — инфраструктурные компоненты (например, конфигурации, миграции, провайдеры).
  2. Слайсы (Features):
    • Каждая фича представляет собой независимый модуль, который содержит всё необходимое для своей работы (контроллеры, модели, сервисы, репозитории, тесты и т.д.).

Пример структуры проекта:

app/
├── Console/
├── Exceptions/
├── Http/
│   ├── Controllers/
│   ├── Middleware/
│   └── Requests/
├── Models/
├── Providers/
└── Services/
features/
├── Auth/
│   ├── Actions/
│   ├── Contracts/
│   ├── Data/
│   ├── Http/
│   │   ├── Controllers/
│   │   ├── Requests/
│   │   └── Resources/
│   ├── Jobs/
│   ├── Models/
│   ├── Policies/
│   ├── Repositories/
│   ├── Services/
│   └── Tests/
├── Blog/
│   ├── Actions/
│   ├── Contracts/
│   ├── Data/
│   ├── Http/
│   │   ├── Controllers/
│   │   ├── Requests/
│   │   └── Resources/
│   ├── Jobs/
│   ├── Models/
│   ├── Policies/
│   ├── Repositories/
│   ├── Services/
│   └── Tests/
shared/
├── Enums/
├── Helpers/
├── Traits/
├── Contracts/
└── Services/
infrastructure/
├── Config/
├── Database/
│   ├── Migrations/
│   ├── Seeders/
│   └── Factories/
├── Providers/
└── Routes/

Описание структуры:

1. App

  • Ядро приложения, где находятся общие компоненты, такие как:
    • Console — команды Artisan.
    • Exceptions — кастомные исключения.
    • Http — базовые контроллеры, middleware, запросы.
    • Models — базовые модели.
    • Providers — сервис-провайдеры.
    • Services — общие сервисы.

2. Features

  • Каждая фича (например, Auth, Blog) — это отдельный модуль, который содержит всё необходимое для своей работы:
    • Actions — классы для выполнения конкретных действий (например, регистрация пользователя).
    • Contracts — интерфейсы для сервисов и репозиториев.
    • Data — DTO (Data Transfer Objects) или другие данные.
    • Http — контроллеры, запросы, ресурсы для API.
    • Jobs — задачи для очередей.
    • Models — модели, относящиеся к фиче.
    • Policies — политики авторизации.
    • Repositories — слой работы с базой данных.
    • Services — бизнес-логика.
    • Tests — тесты для фичи.

3. Shared

  • Общие ресурсы, которые используются в нескольких фичах:
    • Enums — перечисления.
    • Helpers — вспомогательные функции.
    • Traits — трейты.
    • Contracts — общие интерфейсы.
    • Services — общие сервисы.

4. Infrastructure

  • Инфраструктурные компоненты:
    • Config — конфигурации.
    • Database — миграции, сидеры, фабрики.
    • Providers — провайдеры для регистрации сервисов.
    • Routes — маршруты (можно разделить на файлы для каждой фичи).

Пример фичи Auth:

features/
└── Auth/
    ├── Actions/
    │   └── RegisterUserAction.php
    ├── Contracts/
    │   └── AuthServiceInterface.php
    ├── Data/
    │   └── RegisterUserData.php
    ├── Http/
    │   ├── Controllers/
    │   │   └── AuthController.php
    │   ├── Requests/
    │   │   └── RegisterRequest.php
    │   └── Resources/
    │       └── UserResource.php
    ├── Jobs/
    │   └── SendWelcomeEmail.php
    ├── Models/
    │   └── User.php
    ├── Policies/
    │   └── UserPolicy.php
    ├── Repositories/
    │   └── UserRepository.php
    ├── Services/
    │   └── AuthService.php
    └── Tests/
        ├── Unit/
        │   └── AuthServiceTest.php
        └── Feature/
            └── AuthControllerTest.php

Преимущества такой структуры:

  1. Изоляция фич: Каждая фича независима, что упрощает тестирование и поддержку.
  2. Масштабируемость: Новые фичи добавляются без изменения существующего кода.
  3. Читаемость: Код организован логично, легко найти нужный компонент.
  4. Переиспользование: Общие компоненты вынесены в Shared.

Дополнительные рекомендации:

  • Используйте Service Providers для регистрации зависимостей каждой фичи.
  • Автозагрузка фич может быть настроена через composer.json или отдельные провайдеры.
  • Для маршрутов можно использовать Route::group с префиксами для каждой фичи.

Эта структура хорошо подходит для крупных проектов, где важно поддерживать порядок и гибкость.

Пример AuthController


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Сколько будет 8 + 10?