Паттерн Фасад в PHP
Короткий скринкаст: паттерн «Фасад» (Facade) — простая точка входа для целой подсистемы. Оформление заказа: склад, оплата и доставка прячутся за одним методом.
Описание
Фасад предоставляет клиенту простой интерфейс вместо сложной подсистемы. Вместо того чтобы самому резервировать товар, списывать деньги и оформлять доставку, клиент обращается к одному методу place() фасада OrderFacade. Подсистема остаётся открытой для изменений, но повседневная работа идёт через фасад.
UML-диаграмма
Код
InventoryService.php
class InventoryService
{
public function reserve(string $sku): string
{
return "stock: reserved $sku";
}
}
PaymentService.php
class PaymentService
{
public function charge(int $amount): string
{
return "payment: charged $amount";
}
}
ShippingService.php
class ShippingService
{
public function ship(string $city): string
{
return "shipping: to $city";
}
}
OrderFacade.php
class OrderFacade
{
public function __construct(
private InventoryService $inventory,
private PaymentService $payment,
private ShippingService $shipping,
) {
}
public function place(string $sku, int $amount, string $city): string
{
return implode(' | ', [
$this->inventory->reserve($sku),
$this->payment->charge($amount),
$this->shipping->ship($city),
]);
}
}
demo.php
require_once 'InventoryService.php';
require_once 'PaymentService.php';
require_once 'ShippingService.php';
require_once 'OrderFacade.php';
$facade = new OrderFacade(
new InventoryService(),
new PaymentService(),
new ShippingService(),
);
echo $facade->place('sku-1', 199, 'Berlin').PHP_EOL;
Пример результата
После php demo.php в терминале появится строка из трёх этапов:
stock: reserved sku-1 | payment: charged 199 | shipping: to Berlin
Преимущества
- Даёт простой интерфейс к сложной подсистеме.
- Уменьшает связность: клиент не знает о внутренних классах.
- Скрывает порядок и детали работы подсистемы.
- Удобная единая точка входа для типовых операций.
Когда использовать
- Когда нужен простой интерфейс к сложной подсистеме.
- Когда в подсистеме много взаимозависимых классов.
- Когда нужно разбить систему на слои и очертить границу.
- Когда типовой сценарий повторяется и его стоит обернуть.
Использование в Laravel
В Laravel идею Фасада иллюстрирует Illuminate\Support\Facades\Storage: одна точка входа прячет работу с дисками, драйверами Flysystem и путями. Весь набор Illuminate\Support\Facades\* (Cache, Mail, Log) даёт простой статический API поверх менеджеров и контейнера. Технически это прокси-фасады, но по роли они выполняют именно упрощение подсистемы.