Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти
Інше
Події Про нас
Посібники 26 червня 2026

Decorator - middleware як обгортка

Decorator додає об'єкту нову поведінку, обгортаючи його в інший об'єкт із тим самим інтерфейсом, без змін у базовому компоненті.

Яку проблему вирішує

Коли потрібно нарощувати функціональність (логування, кешування, авторизація), спадкування дає вибух підкласів на кожну комбінацію можливостей. До того ж поведінку часто хочеться вмикати динамічно й комбінувати у довільному порядку.

Як вирішує

Декоратор реалізує той самий інтерфейс, що й обгорнутий об'єкт, виконує свою частину роботи й делегує решту далі. Шари накладаються один на одного, тож поведінка комбінується композицією, а не спадкуванням.

У Laravel ця ідея природно виглядає як Middleware: кожен middleware обгортає наступний і додає поведінку. Формально middleware - це framework-реалізація ідей Decorator та Chain of Responsibility.

use Closure;
use Illuminate\Http\Request;

class LogTime
{
  public function handle(Request $request, Closure $next)
  {
    $start = microtime(true);
    $response = $next($request);
    $ms = (microtime(true) - $start) * 1000;
    logger()->info('req ms', ['ms' => $ms]);

    return $response;
  }
}

// Застосувати middleware напряму за класом:
Route::middleware(LogTime::class)
  ->get('/orders', [OrderController::class, 'index']);

// Або зареєструвати аліас у bootstrap/app.php (Laravel 11+):
->withMiddleware(function (Middleware $middleware) {
    $middleware->alias([
        'log.time' => LogTime::class,
    ]);
})

Route::middleware('log.time')->get('/', HomeController::class);

Де застосовувати

  • Кросфункціональні задачі: логування, кешування, авторизація, rate-limit.
  • Коли поведінку треба вмикати опціонально й комбінувати у різному порядку.

Плюси та мінуси

  • + Логіка додається шарами і легко комбінується без вибуху підкласів.
  • + Композиція гнучкіша за спадкування - шари вмикаються динамічно.
  • Порядок шарів важливий і його треба контролювати.
  • Багато дрібних обгорток ускладнюють відлагодження стека викликів; тримайте кожен декоратор маленьким і відповідальним за одну річ.
44

Ця стаття - частина серії

Патерни проєктування

9 / 24

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Читайте також

Вакансії за темою

Softprom Нова
Сьогодні

FullStack Developer (PHP Laravel + React) for Automation and AI

FullStack розробник для проектів автоматизації та AI. Розробка backend на PHP Laravel з мікросервісною архітектурою, інтеграція ERP/CRM систем (NetSuite, HubSpot), та frontend на React з AI-функціоналом (chatbots, генерація контенту). Потребує 5+ років PHP, 3+ років Laravel на рівні архітектури, досвід мікросервісів, OOP, REST API, Websockets.

IT Dream Service Нова
1 дн. тому

Full-Stack Developer (PHP Laravel + Vue 3)

Full-Stack розробник для внутрішної B2B-платформи управління задачами. Розробка backend на Laravel 10/11 та frontend на Vue 3 + Inertia.js, проектування MySQL, тестування (PHPUnit/Vitest), робота з дизайн-системою Tailwind. Вимога: 3+ років досвіду з Laravel та Vue 3, знання Inertia.js/SPA, MySQL, REST API, Git-флоу, SOLID.

Pitch Avatar Нова
1 дн. тому

FullStack Developer (React+PHP Laravel) in AI Product Company

FullStack розробник для AI-продукту. Розробка React-інтерфейсів та PHP Laravel мікросервісів, інтеграція з LLM (ChatGPT), оптимізація промптів. Вимоги: 5+ років PHP, 3+ років Laravel та React/TypeScript, досвід мікросервісної архітектури, OOP/SOLID, REST API, WebSocket.

Пакети за темою

Bagisto

bagisto/bagisto

Bagisto — це платформа для електронної комерції, побудована на Laravel. Вона надає готове рішення для створення та управління інтернет-магазинами з підтримкою каталогу товарів, замовлень, платежів та клієнтів.

27,950 v2.4.9 12 15

Lang

laravel-lang/lang

Список 126 мов для Laravel Framework, Laravel Jetstream, Laravel Fortify, Laravel Breeze, Laravel Cashier, Laravel Nova, Laravel Spark та Laravel UI.

7,774 15.34.0 8

Відео за темою