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,...
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
use App\Http\Middleware\Test;
Route::post('test', [AuthController::class, 'test'])->middleware(Test::class);
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']);
});
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']);
});
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']
}