Reputation: 544
I have a route like this:
Route::get('users/{type}', ['as'=>'users.index', 'uses'=>'UserController@index', 'middleware' => ['can:user-index']])->where('type', '(members|enquiries)');
Can I use dynamic middleware here based on route parameter type.
Like If type is enquiries then middleware should be 'can:enquiries-index'
, similarly for members 'can:members-index'
.
I know this can be done in controller function with authorize method, but I am using all authorizations in route file only. SO wanted to keep this here only.
I am using Laravel Gates definition for authorizing routes:
In AuthServiceProvider@boot
Gate::before(function ($user, $ability) {
$permission = Permission::where('slug', $ability)->first();
return $user->hasPermissionTo($permission);
});
Laravel Version: 7.9.2
PHP Version: 7.2
Upvotes: 0
Views: 1230
Reputation: 9624
No you can't do dynamic middleware but you don't have to do it in controller too. You may do something like that; You bind two middleware to that route.
Route::get('users/{type}', ['as'=>'users.index', 'uses'=>'UserController@index', 'middleware' => ['can:members-index', 'can:enquiries-index']])->where('type', '(members|enquiries)');
Just check type
is as expected in that middleware, such as;
// 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
}
}
Edit:
While using policies, it is possible to use same check block inside the service provider such request()->route()->parameter('type')
.
Upvotes: 1