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()