> Что такое гексагональная архитектура? (PHP)

Уровень: junior · Роль: backend · Язык: PHP · Категория: Технические вопросы

Компании: Travelata

Стек: PHP

> Пример ответа

Короткий ответ

Гексагональная архитектура (ports and adapters) - это паттерн проектирования, который изолирует бизнес-логику от внешних систем (БД, API, UI). В центре находится домен, а взаимодействие с внешним миром происходит через порты (интерфейсы) и адаптеры (реализации). Это позволяет менять БД, фреймворки или протоколы без изменения ядра приложения.

Подробное объяснение

Гексагональная архитектура, предложенная Алистером Кокберном, строится вокруг трёх ключевых идей:

  • Ядро (domain) - чистая бизнес-логика, не зависит ни от чего внешнего.
  • Порты (ports) - интерфейсы, которые определяют, как ядро взаимодействует с внешним миром. Бывают входные (driving ports) - для команд от пользователя, и выходные (driven ports) - для получения данных извне.
  • Адаптеры (adapters) - конкретные реализации портов: контроллеры, репозитории, клиенты API.

Основной принцип - dependency inversion: зависимости направлены внутрь, к домену. Внешние слои зависят от интерфейсов, а не наоборот.

В PHP это часто реализуется через:

  • интерфейсы для репозиториев (например, UserRepositoryInterface),
  • сервисы, которые принимают эти интерфейсы через конструктор,
  • адаптеры вроде DoctrineUserRepository или RedisCacheAdapter.

На практике

В типичном PHP-проекте (например, на Symfony или Laravel) гексагональная архитектура означает:

  • Контроллеры - это входные адаптеры. Они получают HTTP-запрос, преобразуют его в команду и передают в сервис.
  • Сервисы (use cases) - содержат бизнес-логику и работают только с интерфейсами.
  • Репозитории, кэш, внешние API - выходные адаптеры, реализующие интерфейсы из домена.
  • Модели и сущности - чистые PHP-классы без зависимостей от фреймворка.

На практике это даёт:

  • лёгкое тестирование (можно подменить адаптеры моками),
  • независимость от фреймворка,
  • возможность замены инфраструктуры без изменения кода ядра.

Пример кода

PHP
<?php
// Доменный порт (выходной)
interface UserRepositoryInterface
{
public function findById(int $id): ?User;
}
// Доменная сущность
class User
{
public function __construct(
private int $id,
private string $name
) {}
}
// Use case (сервис приложения)
class GetUserName
{
public function __construct(
private UserRepositoryInterface $repository
) {}
public function execute(int $userId): string
{
$user = $this->repository->findById($userId);
return $user ? $user->name : 'unknown';
}
}
// Выходной адаптер (конкретная реализация)
class DoctrineUserRepository implements UserRepositoryInterface
{
public function findById(int $id): ?User
{
// реальный запрос к БД через Doctrine
return new User($id, 'John');
}
}
// Входной адаптер (контроллер)
class UserController
{
public function show(int $id): string
{
$service = new GetUserName(new DoctrineUserRepository());
return $service->execute($id);
}
}

Как отвечать на собеседовании

Начни с определения: гексагональная архитектура - это способ отделить бизнес-логику от инфраструктуры. Затем объясни три компонента: ядро, порты, адаптеры. Приведи пример из PHP: контроллер как входной адаптер, репозиторий как выходной. Подчеркни, что главная цель - возможность замены внешних систем без изменения домена. Если спросят про отличия от слоистой архитектуры, скажи, что здесь зависимости направлены внутрь, а не сверху вниз.

Что проверяет интервьюер

Интервьюер проверяет:

  • понимание принципа dependency inversion,
  • умение различать порты и адаптеры,
  • способность объяснить, зачем это нужно на практике,
  • знание, как это применить в PHP-проекте,
  • понимание trade-off: сложность ради гибкости.

Типичные ошибки

  • Путать гексагональную архитектуру с чистой архитектурой - это разные паттерны, хотя и похожи.
  • Считать, что адаптеры - это только БД. На самом деле это любые внешние системы: API, кэш, файловая система.
  • Говорить, что ядро не может иметь зависимостей вообще - оно может зависеть от стандартной библиотеки PHP.
  • Не упоминать, что порты бывают входные и выходные.
  • Приводить пример без интерфейсов - это уже не гексагональная архитектура, а просто слои.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью