LazyCodet

a

21:38:42 4/5/2024 - 5 views -
Programming

Middleware in Laravel. Supper easy understanding

Understanding about Middleware

I will explain middleware for easy understanding

​Path of a request when you don't use Middleware like this:

Request => Controller

​If you use Middleware, the path is like this:

​Request => Middleware => Controller

​At middleware, you can do something before it really reaches the Controller. For example: you can authenticate the users,...

​Create a Middleware

​I will create a middleware named Test

php artisan make:middleware Test

​Appearing a file app/Http/Middleware/Test.php

​In Test.php file, the content is like this:

<?php
namespace App\Http\Middleware;
use Illuminate\Support\Facades\App;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class Test
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        if(App::environment('local'))
        {
            return $next($request);
        }
        abort(403, 'Access denied');
    }
}

​The meaning of Middleware is to accept access to the controller only if the application is in the local environment

​Usage

​1. Use directly

use App\Http\Middleware\Test;
Route::post('test', [AuthController::class, 'test'])->middleware(Test::class);
​2. Add Middleware to Kernel

​Add the path class to app/Http/Kernel.php (Laravel 10)

protected $middlewareAliases = [
	//... Other middleware
	'test' => \App\Http\Middleware\Test::class
];

Note: In other versions of Laravel, the variable name in Kernel.php may be different.

​Use:

Route::post('test', [AuthController::class, 'test'])->middleware('test');

​Or use multiple middleware for a route:

Route::post('test', [AuthController::class, 'test'])->middleware(['test','test2']);

​Or use middleware for multiple routes:

Route::middleware('test')->group(function () {
    Route::post('test-1', [AuthController::class, 'test-1']);
    Route::post('test-2', [AuthController::class, 'test-2']);
});
3. ​Parameter

​I will add a parameter to the handle method named $isTrue

class Test
{
    public function handle(Request $request, Closure $next, $isTrue): Response
    {
        if($isTrue)
        {
            return $next($request);
        }
        abort(403, 'Access denied');
    }
}

​Use:

Route::middleware('test:true')->group(function () {
    Route::post('test-1', [AuthController::class, 'test-1']);
    Route::post('test-2', [AuthController::class, 'test-2']);
});
​4. Pass parameter from Middleware to Controller

​Middleware:

class Test
{
    public function handle(Request $request, Closure $next, $isTrue): Response
    {
        $userData = ['id' => 1, 'username' => 'mary2024'];
        $request->merge(['user' => $userData]);
        return $next($request);
    }
}

​Controller:

function myMethod(Request $request)
{
	return $request->user;
	// ['id' => 1, 'username' => 'mary2024']
}