基于laravel路由参数的中间件
Middleware based on laravel route parameter
我有这样的路线:
Route::get('users/{type}', ['as'=>'users.index', 'uses'=>'UserController@index', 'middleware' => ['can:user-index']])->where('type', '(members|enquiries)');
这里可以根据路由参数类型使用动态中间件吗
喜欢如果类型是查询那么中间件应该是'can:enquiries-index'
,类似的成员'can:members-index'
。
我知道这可以在控制器函数中使用授权方法完成,但我只在路由文件中使用所有授权。所以只想把它放在这里。
我正在使用 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
不,你不能做动态中间件,但你也不必在控制器中做。你可以做类似的事情;您将两个中间件绑定到该路由。
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')
。
我有这样的路线:
Route::get('users/{type}', ['as'=>'users.index', 'uses'=>'UserController@index', 'middleware' => ['can:user-index']])->where('type', '(members|enquiries)');
这里可以根据路由参数类型使用动态中间件吗
喜欢如果类型是查询那么中间件应该是'can:enquiries-index'
,类似的成员'can:members-index'
。
我知道这可以在控制器函数中使用授权方法完成,但我只在路由文件中使用所有授权。所以只想把它放在这里。
我正在使用 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
不,你不能做动态中间件,但你也不必在控制器中做。你可以做类似的事情;您将两个中间件绑定到该路由。
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')
。