MIddleware

06 Июля 2021 23:40

Middleware - это своего рода фильтры через которые проходит запрос к контроллеру. С помощью них можно проводить обработку запросов, например, шифровать cookie, авторизовывать и т.д.

Располагаются Middleware в каталоге app/Http/Middleware. Сами они наследуются от ларавелевских middleware'ов и готовы для редактирования.

Виды middleware из коробки laravel:

  1. Authenticate. Проверяет аутентифицирован ли пользователь или нет и возвращает пользователя на страницу аутентификации, если он не аутентифицирован.
  2. EncryptCookies. Расшифровывает куки при запросе и шифрует при ответе. 
  3. PreventRequestsDuringMaintenance. Проверяет, находится ли приложение в режиме обслуживания (Maintenance) и если да, то приостанавливает запрос и возвращает ответ с невозможностью отобразить страницу.
  4. RedirectIfAuthenticated. Если пользователь аутентифицирован то перенаправляет его в кабинет (или еще куда-нибудь).
  5. TrimStrings. Обрезает параметры в запросе. Например, если прислали email с пробелами в начале или конце. Также, можно указать except для password и confirm_password.
  6. TrustHosts. Позволяет настроить хосты для взаимодействия.
  7. TrustProxies. Позволяет настроить прокси для взаимодействия. Полезно при горизонтальном маштабировании для отказоустойчивости.
  8. VerifyCsrfToken. Обеспечивает защиту от CSRF атаки. Можно использовать except для запросов, например, со страниц платежей.

Примечание. В каждом Middleware есть свойство (тип array) except, куда можно передать исключения.

Помимо основных Middleware, можно создавать свои.

Команда для создания middleware: 

php artisan make:middleware

Созданный Middleware автоматически попадет в каталог с Middleware'ами.

После этого, его необходимо зарегистрировать. Сделать это можно несколькими способами:

  1. Прикрепить сразу к маршруту: Route::get('posts', [PostController::class, 'index'])->name('posts')->middleware(CustomMiddleware::class);. Предварительно его нужно подключить через конструкцию use
  2. Зарегистрировать через файл 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
        ],
    ];
  3. В том же файле 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');

  4. Или добавить в глобальные middleware'ы в свойство $middleware. Он будет автоматически применяться ко всем маршуртам.