Конфигурирование middleware в Laravel 11
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);
prepend()
добавляет middleware в начало глобального стека.append()
добавляет middleware в конец глобального стека.
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
, чтобы они корректно применялись во всём приложении. Счастливого кодинга!