Creating a custom middleware in Laravel 9

How to create and use a custom middleware in Laravel 9.

A middleware means that any HTTP request for that route must pass through it, making it good for checking if a user has permissions or meets a criteria etc.

Laravel create a middleware

For this example the middleware created will be to check if a session key has been set. If it hasn’t then redirect the user to the page where they can set this session.

With artisan create the middleware with a name

php artisan make:middleware CheckInstanceSet

This will generate:

app/Http/Middleware/CheckInstanceSet.php

Open this file and put your logic for the middleware into the handle() function

public function handle(Request $request, Closure $next)
{
    if (Session::has('instance')) {
        return $next($request);
    }

    return redirect()->route('instance.index');
}

This means that if a session key for “instance” exists continue with the HTTP request else redirect to the instance set page.

 

Open app/Http/Kernel.php and find the $routeMiddleware array, this is where you register your middleware with the name and the class

'instance' => \App\Http\Middleware\CheckInstanceSet::class,

Finally, in your routes file assign this middleware by using the name that was used above (instance):

//Needs an instance set to view
Route::get('files', [App\Http\Controllers\FileController::class, 'index'])->middleware(['auth', 'instance']);
Route::get('actions', [App\Http\Controllers\ActionController::class, 'index'])->middleware(['auth', 'instance']);

//Does not need an instance set to view
Route::get('/', [App\Http\Controllers\HomeController::class, 'index'])->middleware();
Route::get('instances', [App\Http\Controllers\InstanceController::class, 'index'])->middleware(['auth']);

Since you modified your routes make sure to refresh the routes with:

php artisan route:cache