Гексагональна архітектура (Алістер Кокберн, 2005), або порти й адаптери, ставить у центр ядро застосунку - бізнес-логіку, яка нічого не знає про зовнішній світ: ні про HTTP, ні про базу, ні про конкретні сервіси.
Порти - інтерфейси, через які ядро спілкується зі світом:
- вхідні (driving) - як світ звертається до ядра: «оформити замовлення», «скасувати підписку» (сценарії використання);
- вихідні (driven) - що ядру потрібно від світу: «зберегти замовлення», «списати оплату», «надіслати сповіщення».
Адаптери - реалізації портів для конкретних технологій:
- вхідні: HTTP-контролер, консольна команда, обробник черги, тест;
- вихідні: репозиторій на Eloquent, клієнт Stripe, відправка через Mailgun.
// вихідний порт - у ядрі
interface PaymentGateway
{
public function charge(Money $amount, PaymentMethod $method): PaymentResult;
}
// адаптер - на краю
final class StripePaymentGateway implements PaymentGateway { /* SDK Stripe */ }
// тестовий адаптер
final class FakePaymentGateway implements PaymentGateway { /* у пам'яті */ }
Чому «шестикутник»: форма не має значення - вона лише показує, що в ядра багато рівноправних «сторін» для підключення, а не «верх» (UI) і «низ» (база), як у шаровій архітектурі.
Що дає:
- тестованість: ядро тестується з тестовими адаптерами - без HTTP, бази й мережі;
- заміна технологій: новий платіжний провайдер - новий адаптер, ядро не змінюється;
- кілька входів: той самий сценарій викликається з вебу, API, CLI, черги;
- відкладені рішення: можна почати з адаптера в пам'яті й обрати технологію пізніше.
Ціна:
- більше інтерфейсів, класів, відображень між доменними об'єктами й моделями сховища;
- у Laravel - протистояння з Eloquent (Active Record змішує домен і збереження), тож повна гексагональність означає відмову від частини зручностей фреймворку.
Прагматичний підхід: порти й адаптери - для меж із зовнішніми системами (платежі, пошта, сторонні API, пошук), де заміна й тестування справді потрібні. А для збереження власних даних - Eloquent напряму, доки предметна область не стане настільки складною, що ізоляція окупиться.
Докладніше в документації: Alistair Cockburn: Hexagonal Architecture