Laravel: структура большого приложения DDD

от автора

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

Структура большого приложения на Laravel должна быть организована таким образом, чтобы обеспечить масштабируемость, поддержку и читаемость кода. Laravel предоставляет гибкую структуру, которую можно адаптировать под нужды проекта. Ниже приведен пример структуры для большого приложения.


1. Стандартная структура Laravel

Laravel уже имеет хорошо организованную структуру, которая подходит для небольших и средних проектов. Вот основные папки и файлы:

app/
  Console/
  Exceptions/
  Http/
    Controllers/
    Middleware/
  Models/
  Providers/
bootstrap/
config/
database/
  migrations/
  seeders/
public/
resources/
  js/
  sass/
  views/
routes/
  api.php
  web.php
storage/
tests/
vendor/

2. Расширенная структура для большого приложения

Для больших приложений стандартной структуры может быть недостаточно. Вот как можно организовать проект:

Основные изменения:

  • Модульность: Разделение приложения на модули (например, по бизнес-логике).
  • Слоистая архитектура: Разделение кода на слои (например, контроллеры, сервисы, репозитории).
  • Доменно-ориентированный дизайн (DDD): Организация кода вокруг доменов.

Пример структуры:

app/
  Console/
  Domain/
    User/
      Actions/
      Contracts/
      DataTransferObjects/
      Events/
      Listeners/
      Models/
      Policies/
      Repositories/
      Services/
      Resources/
      Tests/
    Product/
      Actions/
      Contracts/
      DataTransferObjects/
      Events/
      Listeners/
      Models/
      Policies/
      Repositories/
      Services/
      Resources/
      Tests/
  Exceptions/
  Http/
    Controllers/
      Api/
      Web/
    Middleware/
    Requests/
    Resources/
  Providers/
  Support/
bootstrap/
config/
database/
  migrations/
  seeders/
  factories/
public/
resources/
  js/
  sass/
  views/
routes/
  api/
    v1/
      user.php
      product.php
  web/
    auth.php
    common.php
storage/
tests/
  Feature/
  Unit/
vendor/

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

app/Domain/

  • Модули: Каждая папка (например, User, Product) представляет собой отдельный домен или модуль.
  • Actions: Содержит классы для выполнения конкретных действий (например, регистрация пользователя).
  • Contracts: Интерфейсы для сервисов и репозиториев.
  • DataTransferObjects: DTO для передачи данных между слоями.
  • Events/Listeners: События и их обработчики.
  • Models: Модели Eloquent.
  • Policies: Политики для авторизации.
  • Repositories: Классы для работы с базой данных.
  • Services: Бизнес-логика.
  • Resources: Классы для преобразования данных (например, для API).
  • Tests: Тесты для модуля.

app/Http/

  • Controllers: Контроллеры для обработки запросов.
  • Middleware: Пользовательские middleware.
  • Requests: Классы для валидации запросов.
  • Resources: Классы для форматирования ответов API.

routes/

  • api/: Маршруты для API, разделенные по версиям (например, v1).
  • web/: Маршруты для веб-интерфейса.

database/

  • migrations/: Миграции для создания таблиц.
  • seeders/: Наполнители для тестовых данных.
  • factories/: Фабрики для создания моделей.

tests/

  • Feature/: Функциональные тесты.
  • Unit/: Модульные тесты.

4. Пример использования модуля User

Модель:

namespace App\Domain\User\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $fillable = ['name', 'email', 'password'];
}

Репозиторий:

namespace App\Domain\User\Repositories;

use App\Domain\User\Models\User;

class UserRepository
{
    public function create(array $data): User
    {
        return User::create($data);
    }
}

Сервис:

namespace App\Domain\User\Services;

use App\Domain\User\Repositories\UserRepository;

class UserService
{
    protected $userRepository;

    public function __construct(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    public function registerUser(array $data): User
    {
        return $this->userRepository->create($data);
    }
}

Контроллер:

namespace App\Http\Controllers\Api\V1;

use App\Domain\User\Services\UserService;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class UserController extends Controller
{
    protected $userService;

    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    }

    public function register(Request $request)
    {
        $user = $this->userService->registerUser($request->all());
        return response()->json($user, 201);
    }
}

5. Рекомендации

  • Используйте SOLID: Разделяйте ответственность между классами.
  • Автоматизируйте тестирование: Пишите unit- и feature-тесты.
  • Используйте очереди: Для длительных задач используйте очереди Laravel.
  • Кэширование: Используйте кэш для ускорения работы приложения.
  • Логирование: Настройте логирование для отслеживания ошибок.

Итог

Структура большого приложения на Laravel должна быть модульной, легко поддерживаемой и масштабируемой. Используйте доменно-ориентированный подход и разделяйте код на слои (контроллеры, сервисы, репозитории). Это позволит вам эффективно разрабатывать и поддерживать приложение.


Комментарии

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

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

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