我有一条这样的路线:
Route::get('users/{type}', ['as'=>'users.index', 'uses'=>'UserController@index', 'middleware' => ['can:user-index']])->where('type', '(members|enquiries)');
我可以根据路由参数类型在此处使用动态中间件。
就像类型查询一样,中间件应该是'can:enquiries-index'
,对于成员'can:members-index'
也是这样。
我知道这可以通过使用authorize方法的控制器功能来完成,但是我仅在路由文件中使用所有授权。所以只想保留这里。
我正在使用Laravel Gates定义来授权路线:
在AuthServiceProvider @ boot中
Gate::before(function ($user, $ability) {
$permission = Permission::where('slug', $ability)->first();
return $user->hasPermissionTo($permission);
});
Laravel版本:7.9.2
PHP版本:7.2
答案 0 :(得分:1)
不,您不能做动态中间件,但也不必在控制器中做。您可能会做类似的事情;您将两个中间件绑定到该路由。
Route::get('users/{type}', ['as'=>'users.index', 'uses'=>'UserController@index', 'middleware' => ['can:members-index', 'can:enquiries-index']])->where('type', '(members|enquiries)');
只需检查type
是否在该中间件中即可,例如;
// can:enquiries-index middleware class
public function handle($request, Closure $next)
{
if ($request->route()->parameter('type') === 'enquiries') {
// enquiries related code blocks
}
}
// can:members-index middleware class
public function handle($request, Closure $next)
{
if ($request->route()->parameter('type') === 'members') {
// members related code blocks
}
}
编辑:
使用策略时,可以在服务提供商内部使用相同的检查块,例如request()->route()->parameter('type')
。