Что такое Middleware и как его использовать?php-27

Middleware (промежуточное ПО) — это слой между входящим HTTP-запросом и конечным обработчиком (например, контроллером), который позволяет модифицировать запрос, ответ или выполнять дополнительные действия до/после обработки запроса. Это мощный инструмент для инкапсуляции общей логики (аутентификация, логирование, CORS и т.д.).

Основные принципы Middleware

  1. Последовательность выполнения: Middleware вызываются в порядке их регистрации.
  2. LIFO (Last In, First Out): Ответ проходит через Middleware в обратном порядке.
  3. Прерывание цепочки: Middleware может завершить обработку, отправив ответ раньше (например, при ошибке аутентификации).

Пример Middleware в PHP

<?php
namespace App\Http\Middleware;

use Closure;

class CheckAge
{
    public function handle($request, Closure $next)
    {
        if ($request->age <= 18) {
            return response('Доступ запрещен', 403);
        }
        return $next($request); // Передаем запрос дальше
    }
}

Где использовать Middleware?

  1. Аутентификация: Проверка токенов или сессий.
  2. Логирование: Запись информации о запросах.
  3. CORS: Обработка заголовков для кросс-доменных запросов.
  4. Кеширование: Возврат кешированного ответа.
  5. CSRF-защита: Проверка токенов форм.

Регистрация Middleware

// В файле app/Http/Kernel.php
protected $routeMiddleware = [
    'age' => \App\Http\Middleware\CheckAge::class,
];

Использование в роуте:

Route::get('/content', function () {
    // Контент для взрослых
})->middleware('age');

Собственная реализация Middleware

<?php
class MiddlewareStack
{
    private $middlewares = [];

    public function add(callable $middleware) {
        $this->middlewares[] = $middleware;
    }

    public function handle($request) {
        $handler = array_reduce(
            array_reverse($this->middlewares),
            function($next, $middleware) {
                return function($request) use ($middleware, $next) {
                    return $middleware($request, $next);
                };
            },
            function($request) { return "Final Handler"; }
        );
        return $handler($request);
    }
}

Резюмируем:

  • Middleware — это паттерн для обработки HTTP-запросов/ответов в конвейерной моде.
  • Позволяет разделять ответственность и повторно использовать код.
  • Реализуется во всех современных PHP-фреймворках (Laravel, Symfony, Slim).
  • Может быть как глобальным, так и привязанным к конкретным маршрутам.