Время чтения: 2 мин.
Модульная структура для Laravel приложения, вдохновленная Feature Sliced Design (FSD), может быть организована следующим образом. FSD предлагает разделять приложение на слои и слайсы (фичи), что позволяет улучшить читаемость, поддерживаемость и масштабируемость кода. В контексте Laravel это можно адаптировать, используя модульный подход.
Основные принципы:
- Слои (Layers):
App
— ядро приложения, общие компоненты.Features
— функциональные слайсы (фичи).Shared
— общие ресурсы, используемые между фичами.Infrastructure
— инфраструктурные компоненты (например, конфигурации, миграции, провайдеры).
- Слайсы (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
Преимущества такой структуры:
- Изоляция фич: Каждая фича независима, что упрощает тестирование и поддержку.
- Масштабируемость: Новые фичи добавляются без изменения существующего кода.
- Читаемость: Код организован логично, легко найти нужный компонент.
- Переиспользование: Общие компоненты вынесены в
Shared
.
Дополнительные рекомендации:
- Используйте Service Providers для регистрации зависимостей каждой фичи.
- Автозагрузка фич может быть настроена через
composer.json
или отдельные провайдеры. - Для маршрутов можно использовать
Route::group
с префиксами для каждой фичи.
Эта структура хорошо подходит для крупных проектов, где важно поддерживать порядок и гибкость.
Добавить комментарий