Блог Vaden Pro

Все о самостоятельном создании и продвижении сайтов

Передача параметров в промежуточное ПО (middleware) в Laravel 5.1

Раздел: 

Как Вы помните, в Laravel 5.0 промежуточное программное обеспечение сильно потеряло в своей важности и приоритетности. На ранних этапах развития 5-й версии маршрутные фильтры были вообще удалены, но довольно скоро они были возвращены, скорее всего из-за того, что Вы не могли передавать параметры в промежуточное ПО, а значит сделать полноценную замену фильтрам не получалось.

Laravel middleware параметры

Но теперь все изменилось. В Laravel 5.1 middleware теперь может принимать параметры. И это не может не радовать.

Когда можно использовать middleware параметры?

Помните, что промежуточное ПО сопровождает весь Ваш запрос приложению. Оно принимает запрос, выполняет некоторую работу и отдает ответ. И обычно, это делается последовательно, в каждой секции Вашего приложения.

Но что если вы хотите настроить то, как будет обработано промежуточное ПО по заданному маршруту, без создания нового промежуточного ПО для каждого места, которое будет подвержено изменениям?

Давайте рассмотрим самый распространенный пример: сфера аутентификации в middleware строится на ролях. И Вы хотите, в определении маршрута выбрать как будет работать аутентификационное промежуточное ПО, передав ему параметр «role», который определяет какая роль пользователя необходима для того, чтобы получить доступ к данному маршруту.

Использование параметризированного промежуточного ПО в определении маршрутов

Когда Вы добавляете middleware в определение маршрута, по-нормальному Вы сделаете это так:

Route::get('company', ['middleware' => 'auth', function () {
    return view('company.admin');
}]);

Итак, давайте добавим в наш параметр уточнение, что пользователь должен иметь роль owner:

Route::get('company', ['middleware' => 'auth:owner', function () {
    return view('company.admin');
}]);

Также полезно будет знать, что можно добавлять несколько параметров воспользовавшись в качестве разделителя запятой:

Route::get('company', ['middleware' => 'auth:owner,view', function () {
    return view('company.admin');
}]);

Создание параметризированного промежуточного программного обеспечения

Итак, как же проабгрейдить наше middleware так, чтобы оно научилось принимать параметры?

<?php
 
namespace App\Http\Middleware;
 
use Closure;
 
class Authentication
{
    public function handle($request, Closure $next, $role)
    {
        if (auth()->check() && auth()->user()->hasRole($role)) {
            return $next($request);
        }
 
        return redirect('login');
    }
}

Обратите внимание, что handle() метод, который обычно принимает только $request и $next параметры, содержит третий параметр, который и является параметром нашего промежуточного ПО. Если же Вы передали несколько параметров в middleware укажите, что необходимо добавить больше параметров в handle() метод:

public function handle($request, Closure $next, $role, $action)

Важно: Если Вы никогда не использовали промежуточное ПО ранее, вам следует убедиться, что это промежуточное ПО зарегистрировано в HTTP Kernel как routeMiddleware, поскольку нет ни единого способа для передачи параметров универсальному middleware.

Подводя итоги

Ну вот и все. Больше нет ни одной причины для использования фильтров.

Узнать больше о нововведениях Laravel 5.1 можно в соответствующей статье.

Перевод Matt Stauffer "Passing parameters to Middleware in Laravel 5.1"