Laravel: возможно ли промежуточному программному обеспечению принимать ввод маршрута?

Чего я хочу добиться, так это того, что у меня есть аудитория в нескольких странах. У меня также есть редакторы в другой стране.

Например, редактор в США может редактировать и просматривать только сообщения в США, редактор в Гонконге не может просматривать сообщения в США.

Route::get('{country}/posts', [
    'uses' => 'CountryController@posts',
    'middleware' => ['permission:view posts,{country}'], <------- SEE HERE
]);

Можно ли этого добиться?

P / S: Я использую Spatie Laravel-разрешение

2 ответа

Решение

Это невозможно, но я использую следующие строки кода в промежуточном программном обеспечении:

$country = $request->route('country'); // gets 'us' or 'hk'

Этот метод Request возвращает сегмент маршрута.

Проще создать другое промежуточное ПО, что-то вроде этого:

namespace App\Http\Middleware;

use Closure;

class CountryCheck
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // The method `getEnabledCountries` returns an array 
        // with the countries enabled for the user
        if(in_array($request->route('country'), Auth::user()->getEnabledCountries())) {
           return $next($request);
        }

        // abort or return what you prefer

    }
}

Во всяком случае... country Параметр бесполезен в моем совете, если пользователь может видеть только сообщения из своей страны... Если вы уже знаете языковой стандарт пользователя и у вас уже есть это правило... почему вы должны сделать еще одну проверку?

На мой взгляд, лучше создать маршрут как Route::get('posts') и внутри контроллера загружаем посты, относящиеся к стране пользователя... Что-то вроде:

Post::where('locale', '=', Auth::user()->locale())->get()

или с областью:

Post::whereLocale(Auth::user()->locale())->get()

Другие вопросы по тегам