Sunny Kumar
Sunny Kumar

Reputation: 544

Middleware based on laravel route parameter

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

Answers (1)

Ersoy
Ersoy

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

Related Questions