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