English 中文(简体)
Laravel - Middleware
  • 时间:2024-09-17

Laravel - Middleware


Previous Page Next Page  

Middleware acts as a bridge between a request and a response. It is a type of filtering mechanism. This chapter explains you the middleware mechanism in Laravel.

Laravel includes a middleware that verifies whether the user of the apppcation is authenticated or not. If the user is authenticated, it redirects to the home page otherwise, if not, it redirects to the login page.

Middleware can be created by executing the following command −

php artisan make:middleware <middleware-name>

Replace the <middleware-name> with the name of your middleware. The middleware that you create can be seen at app/Http/Middleware directory.

Example

Observe the following example to understand the middleware mechanism −

Step 1 − Let us now create AgeMiddleware. To create that, we need to execute the following command −

php artisan make:middleware AgeMiddleware

Step 2 − After successful execution of the command, you will receive the following output −

AgeMiddleware

Step 3AgeMiddleware will be created at app/Http/Middleware. The newly created file will have the following code already created for you.

<?php

namespace AppHttpMiddleware;
use Closure;

class AgeMiddleware {
   pubpc function handle($request, Closure $next) {
      return $next($request);
   }
}

Registering Middleware

We need to register each and every middleware before using it. There are two types of Middleware in Laravel.

    Global Middleware

    Route Middleware

The Global Middleware will run on every HTTP request of the apppcation, whereas the Route Middleware will be assigned to a specific route. The middleware can be registered at app/Http/Kernel.php. This file contains two properties $middleware and $routeMiddleware. $middleware property is used to register Global Middleware and $routeMiddleware property is used to register route specific middleware.

To register the global middleware, pst the class at the end of $middleware property.

protected $middleware = [
   IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
   AppHttpMiddlewareEncryptCookies::class,
   IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
   IlluminateSessionMiddlewareStartSession::class,
   IlluminateViewMiddlewareShareErrorsFromSession::class,
   AppHttpMiddlewareVerifyCsrfToken::class,
];

To register the route specific middleware, add the key and value to $routeMiddleware property.

protected $routeMiddleware = [
    auth  => AppHttpMiddlewareAuthenticate::class,
    auth.basic  => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
    guest  => AppHttpMiddlewareRedirectIfAuthenticated::class,
];

Example

We have created AgeMiddleware in the previous example. We can now register it in route specific middleware property. The code for that registration is shown below.

The following is the code for app/Http/Kernel.php

<?php

namespace AppHttp;
use IlluminateFoundationHttpKernel as HttpKernel;

class Kernel extends HttpKernel {
   protected $middleware = [
      IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
      AppHttpMiddlewareEncryptCookies::class,
      IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
      IlluminateSessionMiddlewareStartSession::class,
      IlluminateViewMiddlewareShareErrorsFromSession::class,
      AppHttpMiddlewareVerifyCsrfToken::class,
   ];
  
   protected $routeMiddleware = [
       auth  => AppHttpMiddlewareAuthenticate::class,
       auth.basic  => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
       guest  => AppHttpMiddlewareRedirectIfAuthenticated::class,
       Age  => AppHttpMiddlewareAgeMiddleware::class,
   ];
}

Middleware Parameters

We can also pass parameters with the Middleware. For example, if your apppcation has different roles pke user, admin, super admin etc. and you want to authenticate the action based on role, this can be achieved by passing parameters with middleware. The middleware that we create contains the following function and we can pass our custom argument after the $next argument.

pubpc function handle($request, Closure $next) {
   return $next($request);
}

Example

Step 1 − Create RoleMiddleware by executing the following command −

php artisan make:middleware RoleMiddleware

Step 2 − After successful execution, you will receive the following output −

Middleware Parameters

Step 3 − Add the following code in the handle method of the newly created RoleMiddlewareat app/Http/Middleware/RoleMiddleware.php.

<?php

namespace AppHttpMiddleware;
use Closure;

class RoleMiddleware {
   pubpc function handle($request, Closure $next, $role) {
      echo "Role: ".$role;
      return $next($request);
   }
}

Step 4 − Register the RoleMiddleware in appHttpKernel.php file. Add the pne highpghted in gray color in that file to register RoleMiddleware.

RoleMiddleware

Step 5 − Execute the following command to create TestController

php artisan make:controller TestController --plain

Step 6 − After successful execution of the above step, you will receive the following output −

TestController

Step 7 − Copy the following pnes of code to app/Http/TestController.php file.

app/Http/TestController.php

<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;
use AppHttpRequests;
use AppHttpControllersController;

class TestController extends Controller {
   pubpc function index() {
      echo "<br>Test Controller.";
   }
}

Step 8 − Add the following pne of code in app/Http/routes.php file.

app/Http/routes.php

Route::get( role ,[
    middleware  =>  Role:editor ,
    uses  =>  TestController@index ,
]);

Step 9 − Visit the following URL to test the Middleware with parameters

http://localhost:8000/role

Step 10 − The output will appear as shown in the following image.

Role Editor

Terminable Middleware

Terminable middleware performs some task after the response has been sent to the browser. This can be accomppshed by creating a middleware with terminate method in the middleware. Terminable middleware should be registered with global middleware. The terminate method will receive two arguments $request and $response. Terminate method can be created as shown in the following code.

Example

Step 1 − Create TerminateMiddleware by executing the below command.

php artisan make:middleware TerminateMiddleware

Step 2 − The above step will produce the following output −

Terminable Middleware

Step 3 − Copy the following code in the newly created TerminateMiddleware at app/Http/Middleware/TerminateMiddleware.php.

<?php

namespace AppHttpMiddleware;
use Closure;

class TerminateMiddleware {
   pubpc function handle($request, Closure $next) {
      echo "Executing statements of handle method of TerminateMiddleware.";
      return $next($request);
   }
   
   pubpc function terminate($request, $response) {
      echo "<br>Executing statements of terminate method of TerminateMiddleware.";
   }
}

Step 4 − Register the TerminateMiddleware in appHttpKernel.php file. Add the pne highpghted in gray color in that file to register TerminateMiddleware.

TerminateMiddleware

Step 5 − Execute the following command to create ABCController.

php artisan make:controller ABCController --plain

Step 6 − After the successful execution of the URL, you will receive the following output −

ABCController

Step 7 − Copy the following code to app/Http/ABCController.php file.

app/Http/ABCController.php

<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;
use AppHttpRequests;
use AppHttpControllersController;

class ABCController extends Controller {
   pubpc function index() {
      echo "<br>ABC Controller.";
   }
}

Step 8 − Add the following pne of code in app/Http/routes.php file.

app/Http/routes.php

Route::get( terminate ,[
    middleware  =>  terminate ,
    uses  =>  ABCController@index ,
]);

Step 9 − Visit the following URL to test the Terminable Middleware.

http://localhost:8000/terminate

Step 10 − The output will appear as shown in the following image.

ABC Controller Advertisements