Как применить разные Middlewares для одного роута?

Есть роут

Route::get('articles', 'ArticleController@index')->name('articles.index');

Есть две роли пользователя. Writer и Admin.

Для каждой роли существует группа мидлварей, определенных в Kernel.

Мне нужно, чтобы для каждой роли загружался свой список мидлварей.

Если бы я делал разные маршруты, я бы просто дописал к роуту

->middleware('forWriter') 

И проблем нет. Но у меня 1 маршрут. И как быть? Как запустить разные группы мидлварей для одного роута или какой есть параллельный способ проверить запрос для разных ролей при одном маршруте?


Ответы (1 шт):

Автор решения: Dmitrii Sedov

Не вижу проблем. Просто сделайте так к примеру:

Route::get('articles', 'ArticleController@index')
->name('articles.index')
->middleware(['forWriter', 'forAdmin']);

Далее в самих middleware у вас всегда известно кто на входе пришёл. Например:

//forWriter 1

public function handle($request, Closure $next)
{
    if ($request->user()->isWriter()) {
        // проверяете доступы для роли Writer иначе просто пропускаете!
    }

    return $next($request);
} 

Так же вторую группу, только для админа! в результате применится тот посредник который необходим определённой роли!

То что в каждом middleware из группы нужно сделать проверку, это ничего страшного. Либо сделайте какой-нибудь хелпер, чтобы избежать дубля кода и вызывайте его в middleware

→ Ссылка