← Назад к вопросам

Что такое инфраструктурный слой (Infrastructure Layer)?

2.0 Middle🔥 231 комментариев
#Архитектура и паттерны

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое инфраструктурный слой (Infrastructure Layer)?

Инфраструктурный слой (Infrastructure Layer) — это часть архитектуры программного обеспечения, которая отделяет техническую реализацию от бизнес-логики. В рамках Clean Architecture, Domain-Driven Design (DDD) или многослойных подходов (n-tier architecture) этот слой служит мостом между ядром системы и внешними системами или ресурсами. Он отвечает за низкоуровневые детали, которые не должны "загрязнять" бизнес-правила.

Основная цель и функции инфраструктурного слоя

Главная цель — абстрагирование технических сложностей. Слой реализует интерфейсы, определенные в слое домена (Domain Layer) или слое приложения (Application Layer). Ключевые функции включают:

  • Интерфейсы с внешними системами: Работа с базами данных, внешними API, файловыми системами, кэшем, почтовыми сервисами.
  • Реализация паттернов доступа к данным: Создание репозиториев (Repository), которые абстрагируют доступ к данным, реализация Unit of Work.
  • Обработка событий и брокеров сообщений: Интеграция с RabbitMQ, Kafka для обработки событий домена.
  • Управление зависимостями и конфигурацией: Реализация Dependency Injection, чтение конфигурационных файлов или переменных окружения.
  • Аутентификация и авторизация: Интеграция с системами безопасности (OAuth, JWT), но бизнес-правила авторизации остаются в домене.

Как это работает в PHP на практике

Рассмотрим классический пример с репозиториями в DDD. Доменный слой определяет интерфейс репозитория, а инфраструктурный слой предоставляет его конкретную реализацию с использованием, например, Doctrine ORM.

<?php
// 1. Domain Layer (Интерфейс — бизнес-контракт)
namespace Domain\User;

interface UserRepositoryInterface
{
    public function findById(UserId $id): ?User;
    public function save(User $user): void;
    public function findByEmail(string $email): ?User;
}
<?php
// 2. Infrastructure Layer (Конкретная реализация с техническими деталями)
namespace Infrastructure\Persistence\Doctrine;

use Domain\User\User;
use Domain\User\UserId;
use Domain\User\UserRepositoryInterface;
use Doctrine\ORM\EntityManagerInterface;

class DoctrineUserRepository implements UserRepositoryInterface
{
    private EntityManagerInterface $entityManager;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function findById(UserId $id): ?User
    {
        return $this->entityManager->find(User::class, $id->getValue());
    }

    public function save(User $user): void
    {
        $this->entityManager->persist($user);
        $this->entityManager->flush();
    }

    public function findByEmail(string $email): ?User
    {
        return $this->entityManager
            ->createQueryBuilder('u')
            ->where('u.email = :email')
            ->setParameter('email', $email)
            ->getQuery()
            ->getOneOrNullResult();
    }
}

Ключевые преимущества использования инфраструктурного слоя

  • Сохранение чистоты домена: Доменный слой не зависит от фреймворков, библиотек или технологий (Doctrine, Laravel Eloquent). Это делает бизнес-логику переносимой и устойчивой к изменениям в инфраструктуре.
  • Упрощение тестирования: Доменные объекты и сервисы можно тестировать с помощью моков (mock) или стабов (stub) репозиториев, без необходимости запуска реальной базы данных. Это unit-тесты, они быстры и надежны.
  • Гибкость и заменяемость: Если нужно перейти с Doctrine на другую ORM или даже на NoSQL базу, изменения происходят только в инфраструктурном слое. Ядро системы остается неизменным.
  • Следование принципу Dependency Inversion: Высокоуровневые модули (домен) не зависят от низкоуровневых (инфраструктура). Оба зависят от абстракций (интерфейсов).

Что обычно находится в инфраструктурном слое PHP-проекта?

В типичном Symfony или Laravel проекте, организованном по принципам Clean Architecture, в инфраструктурный слой попадают:

Infrastructure/
├── Persistence/           # Реализации репозиториев (Doctrine, Eloquent)
│   ├── Doctrine/
│   └── MongoDB/
├── Messaging/            # Клиенты RabbitMQ, AWS SQS, обработчики событий
├── Cache/                # Реализации Redis, Memcached
├── FileStorage/          # Интеграция с AWS S3, локальной файловой системой
├── ExternalApiClients/   # HTTP-клиенты для сторонних API (Guzzle)
├── Auth/                 # Реализации JWT-аутентификации, OAuth-клиенты
└── DependencyInjection/  # Конфигурации Symfony Container, Laravel Service Providers

Вывод

Инфраструктурный слой — это не просто "код для работы с базой данных". Это стратегический абстракционный барьер, который защищает самое ценное в системе — её бизнес-логику и правила — от неизбежных изменений во внешних технологиях и фреймворках. Его правильное выделение и реализация напрямую влияют на тестируемость, поддерживаемость и долгосрочную жизнеспособность PHP-приложения. В современных сложных системах он является обязательным элементом, позволяющим развивать домен независимо и устойчиво.

Что такое инфраструктурный слой (Infrastructure Layer)? | PrepBro