Получить параметр динамического маршрута Laravel в промежуточном программном обеспечении - PullRequest
0 голосов
/ 30 мая 2018

Мы создали CMS, используя Laravel 5.6.Мы создали различные динамические маршруты, как показано ниже:

route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth');

С помощью этого единственного маршрута мы можем получить доступ к неограниченному количеству зарегистрированных таксономий, например:

http://example.com/taxonomy/category
http://example.com/taxonomy/tag
...

Итак, параметр таксономии - это переменная вещьв наших маршрутах.

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

route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth', 'permissions:manage_{taxonomy?}');

И вот в чем проблема.Мы не можем получить этот переменный параметр в параметр промежуточного программного обеспечения.Нам это нужно, потому что пользователи могут иметь разрешение на category, но могут иметь разрешение на tag.Но с этим маршрутом пользователь не может получить доступ ни к одной из таксономий.Весь маршрут заблокирован.

O, мы пробовали и с двойными кавычками:

route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth', "permissions:manage_{taxonomy?}");

Есть ли способ передать динамические переменные маршрута в промежуточное ПО?

1 Ответ

0 голосов
/ 30 мая 2018

После пересмотра Вопроса @ mwafi мы нашли решение для нашего случая:

Мы передаем разрешения на маршрут, как показано ниже:

route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth', 'permissions:manage_{parameter}');

И обработка разрешений в промежуточном программном обеспечении, как показано ниже:

<?php
public function handle($request, Closure $next, $caps) {
    $current_args = $request->route()->parameters();
    // array_shift() is enough as we are passing a single parameter only.
    $current_parameter = array_shift($current_args);

    if (strpos($caps, '{parameter}') !== false) {
        // here the $caps become 'manage_{taxonomy}'
        $caps = str_replace( '{parameter}', $current_parameter, $caps );
    }

    // hasUserCap() - custom method to check user capability.
    if( hasUserCap( $caps, $request->user()->id ) ) {
        return $next($request);
    }
}
...