Middleware - это своего рода фильтры через которые проходит запрос к контроллеру. С помощью них можно проводить обработку запросов, например, шифровать cookie, авторизовывать и т.д.
Располагаются Middleware в каталоге app/Http/Middleware
. Сами они наследуются от ларавелевских middleware'ов и готовы для редактирования.
Виды middleware из коробки laravel:
- Authenticate. Проверяет аутентифицирован ли пользователь или нет и возвращает пользователя на страницу аутентификации, если он не аутентифицирован.
- EncryptCookies. Расшифровывает куки при запросе и шифрует при ответе.
- PreventRequestsDuringMaintenance. Проверяет, находится ли приложение в режиме обслуживания (Maintenance) и если да, то приостанавливает запрос и возвращает ответ с невозможностью отобразить страницу.
- RedirectIfAuthenticated. Если пользователь аутентифицирован то перенаправляет его в кабинет (или еще куда-нибудь).
- TrimStrings. Обрезает параметры в запросе. Например, если прислали
email
с пробелами в начале или конце. Также, можно указатьexcept
дляpassword
иconfirm_password
. - TrustHosts. Позволяет настроить хосты для взаимодействия.
- TrustProxies. Позволяет настроить прокси для взаимодействия. Полезно при горизонтальном маштабировании для отказоустойчивости.
- VerifyCsrfToken. Обеспечивает защиту от CSRF атаки. Можно использовать except для запросов, например, со страниц платежей.
Примечание. В каждом Middleware есть свойство (тип array) except, куда можно передать исключения.
Помимо основных Middleware, можно создавать свои.
Команда для создания middleware:
php artisan make:middleware
Созданный Middleware автоматически попадет в каталог с Middleware'ами.
После этого, его необходимо зарегистрировать. Сделать это можно несколькими способами:
- Прикрепить сразу к маршруту:
Route::get('posts', [PostController::class, 'index'])->name('posts')->middleware(CustomMiddleware::class);
. Предварительно его нужно подключить через конструкциюuse
. - Зарегистрировать через файл
app/Http/Kernel.php
. В этом файле есть свойство$middlewareGroups
(тип Array). Добавляем в него еще одну группу и записываем в нее новый middleware.protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'api' => [ 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'test' => [ CustomMiddleware::class ], ];
- В том же файле
app/Http/Kernel.php
добавить в свойство$routeMiddleware
(тип Array) алиас нового middleware и путь к нему:protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'log' => \App\http\Middleware\LogMiddleware::class, ];
И в маршрутах уже можно вызывать middleware следующим образом:
Route::get('posts', [PostController::class, 'index'])->name('posts')->middleware('log');
-
Или добавить в глобальные middleware'ы в свойство
$middleware
. Он будет автоматически применяться ко всем маршуртам.