Конфигурирование middleware в Laravel 11

Источник: «Laravel 11 Middleware Configuration: A Comprehensive Guide»
Laravel 11 представляет новый способ конфигурирования middleware с помощью класса Illuminate\Foundation\Configuration\Middleware. Этот мощный класс предоставляет удобный интерфейс для управления стеком middleware приложения. В статье мы рассмотрим публичные методы класса Middleware и продемонстрируем, как эффективно использовать их в приложении Laravel.

В Laravel 11 настройка middleware обычно выполняется в файле bootstrap/app.php. Для доступа к экземпляру Middleware используется метод withMiddleware:

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
->withMiddleware(function (Middleware $middleware) {
// Здесь можно настроить middleware
})
->create();

Теперь перейдём к рассмотрению различных методов настройки middleware.

Глобальные middleware

prepend() и append()

Методы prepend() и append() позволяют добавлять middleware в глобальный стек:

$middleware->prepend(MyCustomMiddleware::class);
$middleware->append(AnotherMiddleware::class);

remove()

remove() — удаляет middleware из глобального стека:

$middleware->remove(UnwantedMiddleware::class);

replace()

Метод replace() заменяет одно middleware другим:

$middleware->replace(OldMiddleware::class, NewMiddleware::class);

use()

Метод use() позволяет определить весь глобальный стек middleware:

$middleware->use([
TrustProxies::class,
HandleCors::class,
PreventRequestsDuringMaintenance::class,
ValidatePostSize::class,
TrimStrings::class,
ConvertEmptyStringsToNull::class,
]);

Группы middleware

group()

Метод group() определяет новую группу middleware:

$middleware->group('api', [
'throttle:api',
SubstituteBindings::class,
]);

prependToGroup() и appendToGroup()

Методы prependToGroup() и appendToGroup() добавляют middleware в начало и конец существующей группы:

$middleware->prependToGroup('web', EnsureUserIsActive::class);
$middleware->appendToGroup('api', LogApiRequests::class);

removeFromGroup()

Метод removeFromGroup() удаляет middleware из указанной группы:

$middleware->removeFromGroup('web', ShareErrorsFromSession::class);

replaceInGroup()

МетодreplaceInGroup() заменяет middleware внутри заданной группы:

$middleware->replaceInGroup('web', StartSession::class, CustomSessionMiddleware::class);

Методы для Web и API групп

web() и api()

Методыweb() и api() позволяют внести изменения в стандартные группы middleware web и api:

$middleware->web(
append: [EnsureUserIsActive::class],
prepend: [LogWebRequests::class],
remove: [ShareErrorsFromSession::class],
replace: [StartSession::class => CustomSessionMiddleware::class]
);

$middleware->api(
append: [LogApiRequests::class],
prepend: [RateLimiter::class],
remove: ['throttle:api'],
replace: []
);

Middleware для статических страниц

pages()

Метод pages() определяет middleware для статических страниц (удобно при использовании Laravel Folio):

$middleware->pages([
ValidateCsrfToken::class,
SubstituteBindings::class,
]);

Псевдонимы и приоритеты middleware

alias()

Метод aliases() создаёт псевдонимы для middleware:

$middleware->alias([
'auth' => Authenticate::class,
'throttle' => ThrottleRequests::class,
]);

priority()

Метод priority() определяет приоритет/порядок выполнения middleware:

$middleware->priority([
StartSession::class,
ShareErrorsFromSession::class,
ThrottleRequests::class,
SubstituteBindings::class,
]);

Настройка конкретного middleware

encryptCookies()

МетодencryptCookies() настраивает middleware шифрования cookie:

$middleware->encryptCookies(['unencrypted_cookie']);

validateCsrfTokens()

МетодvalidateCsrfTokens() позволяет настроить валидацию токена CSRF:

$middleware->validateCsrfTokens(['/api/*']);

convertEmptyStringsToNull()

МетодconvertEmptyStringsToNull() настраивает преобразование пустых строк:

$middleware->convertEmptyStringsToNull([
fn ($request) => $request->is('api/*')
]);

trimStrings()

МетодtrimStrings() настраивает обрезку строк:

$middleware->trimStrings([
'password',
fn ($request) => $request->is('admin/*')
]);

trustHosts()

МетодtrustHosts() включает и настраивает middleware для доверенных узлов:

$middleware->trustHosts(fn () => [
'example.com',
'*.example.com',
]);

trustProxies()

МетодtrustProxies() настраивает доверенные прокси:

$middleware->trustProxies('192.168.1.1', Illuminate\Http\Request::HEADER_X_FORWARDED_ALL);

preventRequestsDuringMaintenance()

МетодpreventRequestsDuringMaintenance() настраивает исключения для режима обслуживания:

$middleware->preventRequestsDuringMaintenance(['api/*', 'status']);

Конфигурация, специфичная для API

statefulApi()

МетодstatefulApi() включает Sanctum API с поддержкой состояния:

$middleware->statefulApi();

throttleApi()

МетодthrottleApi() настраивает ограничение частоты запросов API:

$middleware->throttleApi('60,1');

throttleWithRedis()

МетодthrottleWithRedis() использует Redis для управления ограничением частоты запросов:

$middleware->throttleWithRedis();

Аутентификация сессии

authenticateSessions()

Метод authenticateSessions() включает аутентификацию сессий для группы 'web':

$middleware->authenticateSessions();

Заключение

Новый класс настройки Middleware в Laravel 11 предоставляет мощный и гибкий способ управления middleware приложения. Используя эти методы, можно легко настраивать стек middleware, создавать группы, устанавливать приоритеты и настраивать определённое поведение middleware.

Не забудьте внести соответствующие настройки в файл bootstrap/app.php, чтобы они корректно применялись во всём приложении. Счастливого кодинга!

Комментарии


Дополнительные материалы

Предыдущая Статья

Git Workflow: Эффективное управление кодовой базой

Следующая Статья

Новое в Symfony 7.2: Атрибут WhenNot