PHP Facade Design Pattern Структурный паттерн

Паттерн Фасад в PHP

Короткий скринкаст: паттерн «Фасад» (Facade) — простая точка входа для целой подсистемы. Оформление заказа: склад, оплата и доставка прячутся за одним методом.

Facade Pattern — открыть страницу урока

Описание

Фасад предоставляет клиенту простой интерфейс вместо сложной подсистемы. Вместо того чтобы самому резервировать товар, списывать деньги и оформлять доставку, клиент обращается к одному методу place() фасада OrderFacade. Подсистема остаётся открытой для изменений, но повседневная работа идёт через фасад.

UML-диаграмма

classDiagram class OrderFacade { -inventory: InventoryService -payment: PaymentService -shipping: ShippingService +__construct(inventory: InventoryService, payment: PaymentService, shipping: ShippingService) +place(sku: string, amount: int, city: string): string } class InventoryService { +reserve(sku: string): string } class PaymentService { +charge(amount: int): string } class ShippingService { +ship(city: string): string } OrderFacade --> InventoryService : uses OrderFacade --> PaymentService : uses OrderFacade --> ShippingService : uses

Код

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 поверх менеджеров и контейнера. Технически это прокси-фасады, но по роли они выполняют именно упрощение подсистемы.