Налаштування middleware у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 25 березня, 2025
З новим Laravel 11 змінилася структура конфігурації middleware, що може зацікавити розробників. Чи готові ви дізнатися, як нові можливості спростять вашу роботу з middleware? Читайте статтю, щоб дізнатися про переваги та нові функції Laravel!

Починаючи з Laravel 11, конфігурація middleware була перенесена з HTTP Kernel у файл bootstrap вашого застосунку. Хоча деякі вже існуючі програми, що оновилися з Laravel 10 до Laravel 11 чи 12, можуть містити визначені middleware, новий Laravel застосунок не постачається з теками app/Http/Middleware.

Laravel 11 представляє нову стандартну структуру застосунку з меншою кількістю файлів. Зокрема, нові задекларовані Laravel застосунки містять менше сервісних провайдерів, middleware та файлів конфігурації.

Однак ми не рекомендуємо тим, хто оновлює Laravel 10 до 11, намагатися змінити структуру свого застосунку, адже Laravel 11 ретельно налаштований і також підтримує структуру застосунку Laravel 10.

Не лякайтеся, якщо ваш застосунок містить стандартні middleware від Laravel. Це може означати, що ваш застосунок оновився до останньої версії, але зберіг згенеровані middleware у своїй структурі.

# Налаштування Middleware у Laravel 11+

Конфігурація всіх middleware у Laravel тепер виконується у файлі bootstrap/app.php за допомогою методу withMiddleware(). З цього файлу ви можете визначати глобальні middleware, додавати, попереджати, створювати псевдоніми тощо.

Якщо ви переходите з Laravel 10, для конфігурації маршрутів ви використовували файл app/Http/Kernel.php і властивість класу. Для глобальних middleware використовувалася властивість $middleware:

protected $middleware = [
    // \App\Http\Middleware\TrustHosts::class,
    \App\Http\Middleware\TrustProxies::class,
    \Illuminate\Http\Middleware\HandleCors::class,
    \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];

У Laravel 11 клас Kernel більше не є частиною коду застосунку. Ось приклад визначення глобального middleware:

// bootstrap/app.php

use App\Http\Middleware\LogRequest;

->withMiddleware(function (Middleware $middleware) {
    // Додати в кінець стеку middleware
    $middleware->append(LogRequest::class);
})

Щоб додати глобальний middleware на початку стеку, ви можете скористатися методом prepend:

use App\Http\Middleware\LogRequest;

->withMiddleware(function (Middleware $middleware) {
    // Додати middleware на початку стеку
    $middleware->prepend(LogRequest::class);
})

# Визначення Груп Middleware

У Laravel 10 та раніше групу middleware визначали за допомогою властивості груп middleware у файлі app/Http/Kernel.php:

protected $middlewareGroups = [
    'web' => [
        // ...
    ],
    'api' => [
        // ...
    ],
    'group-1' => [
        // ...
    ],
];

У нових застосунках Laravel ви можете використовувати методи prepend/append для групування:

$middleware->prependToGroup('group-1', First::class);

$middleware->appendToGroup('group-1', [
    First::class,
    Second::class,
]);

Виникає також питання: "Як я можу налаштувати одну з вбудованих груп, таких як web або api?" Ви можете зробити це, використавши відповідні методи web і api:

$middleware->web(append: [
    ExampleWebMiddleware::class,
]);

$middleware->api(prepend: [
    ExampleApiMiddleware::class,
]);

$middleware->api(remove: [
    ExampleApiMiddleware::class,
]);

# Сортування Middleware

У Laravel 10 пріоритет middleware визначався через властивість $middlewarePriority у файлі HTTP Kernel.php:

protected $middlewarePriority = [
    \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,
    \Illuminate\Cookie\Middleware\EncryptCookies::class,
    // ...
];

Як ви могли здогадатися, пріоритет тепер налаштовується у файлі bootstrap/app.php за допомогою методу priority:

->withMiddleware(function (Middleware $middleware) {
    $middleware->priority([
        //
    ]);
});

# Псевдоніми Middleware

У Laravel 10 ви використовували властивість $middlewareAliases класу Kernel для мапування псевдонімів до middleware, що полегшує додавання middleware до маршрутів і груп:

protected $middlewareAliases = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    // ...
];

Починаючи з Laravel 11, для цього ви повинні використовувати метод alias:

->withMiddleware(function (Middleware $middleware) {
    $middleware->alias([
        'log' => LogRequest::class
    ]);
});

// У маршруті ви можете використовувати `log`
Route::get('/messages/{message}', function () {
    // ...
})->middleware('log');

# Додаткова Інформація

Усе про визначення, налаштування та використання middleware ви можете дізнатися в документації Laravel. Також перевірте документацію Middleware для Laravel 12, але обов'язково використовуйте відповідну документацію для вашої версії Laravel