Что такое middleware в Laravel?php-84

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

Основные концепции middleware

  1. Фильтры запросов: Проверка/модификация входящих запросов
  2. Фильтры ответов: Модификация исходящих ответов
  3. Последовательность выполнения: Middleware выполняются в определенном порядке

Типы middleware

// Глобальный middleware (обрабатывает все запросы)
protected $middleware = [
    \App\Http\Middleware\TrustProxies::class,
    \App\Http\Middleware\CheckForMaintenanceMode::class,
];

// Группы middleware (для маршрутов)
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],

    'api' => [
        'throttle:60,1',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];

// Route middleware (применяется к конкретным маршрутам)
protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
];

Создание middleware

Создаем новый middleware командой:

php artisan make:middleware CheckAge

Пример middleware для проверки возраста:

namespace App\Http\Middleware;

use Closure;

class CheckAge
{
    public function handle($request, Closure $next)
    {
        if ($request->age <= 200) {
            return redirect('home');
        }

        return $next($request);
    }
}

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

  1. Глобальная регистрацияapp/Http/Kernel.php)
  2. Регистрация для групп (web/api)
  3. Применение к маршрутам:
Route::get('admin/profile', function () {
    //
})->middleware('auth');

// Или несколько middleware
Route::get('/', function () {
    //
})->middleware(['first', 'second']);

Последовательность выполнения

Middleware выполняются в порядке:

  1. Глобальные middleware
  2. Группы middleware (web/api)
  3. Route middleware

Прерывание выполнения

Middleware может прервать цепочку выполнения:

public function handle($request, Closure $next)
{
    if (! $request->user()->isAdmin()) {
        abort(403);
    }

    return $next($request);
}

Middleware с параметрами

// Объявление
public function handle($request, Closure $next, $role)
{
    if (! $request->user()->hasRole($role)) {
        abort(403);
    }

    return $next($request);
}

// Использование
Route::put('post/{id}', function ($id) {
    //
})->middleware('role:editor');

Терминальные middleware

Middleware, выполняемые после ответа:

public function handle($request, Closure $next)
{
    $response = $next($request);

    // Логирование после отправки ответа
    Log::info('Request processed');

    return $response;
}

Популярные встроенные middleware

  1. auth - аутентификация
  2. throttle - ограничение частоты запросов
  3. bindings - внедрение моделей
  4. cors - обработка CORS
  5. verified - проверка email

Резюмируем:

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