Laravel Middleware


Middleware आपके Application में entry करने वाली Requests को filter करने का सबसे easy और efficient mechanism है। Means Middleware का use करके हम अपनी need के according हर request के लिए कोई भी action / task perform कर सकते हैं।

For Example : किसी भी तरह के task जहाँ पर authentication की जरूरत होती है , perform करने से पहले हमें ये check करना जरूरी होता है कि , user authenticated है या नहीं। Middleware के though यह काम हम बहुत ही easy और efficient तरीके से कर सकते हैं।

Laravel Application में सभी Middleware app/Http/Middleware में define किये जाते हैं। हालाँकि Laravel में पहले से कुछ predefine Middleware होते हैं जैसे-

  1. VerifyCsrfToken : यह Middleware यह confirm करता है कि POST, PUT, PATCH, or DELETE Type की Request में _token field added है अगर _token field add नहीं है तो request reject कर देता है।

     
    इसलिए POST, PUT, PATCH, or DELETE Type की request के लिए हम <form></form>  में @csrf का use करते हैं। हालाँकि आप VerifyCsrfToken Middleware में $except Array Variable में वो सभी URLs define कर सकते हैं जिनके लिए _token field की जरूरत नहीं है।

  2. TrimString : यह Middleware आने वाली Requests के सभी Input Fields (password , password_confirmation को छोड़कर) को Trim करता है। Menas left & right side से extra whitespace remove करता है। हालाँकि इसमें भी वो सभी input field define कर सकते हैं जिन्हे Trim नहीं करना है।

  3. EncryptCookies : यह Middleware Cookies को encrypt करता है , इसमें भी वो सभी Cookies Define कर सकते हैं जिन्हें आपको encrypt नहीं करना है।


ये सभी Middlewares आपको app/Http/Middleware directory में मिलेंगे , ये preinstalled होते हैं।

Laravel Define Middleware

Middleware define करने के लिए नीचे लिखी Artisan command command अपने terminal में run करें।

php artisan make:middleware MyMiddleware

Command Run होते ही app/Http/Middleware directory में MyMiddleware नाम की एक class generate हो गयी होगी , जो कि कुछ इस तरह से होगी। हालाँकि आप चाहे तो Middleware File manually भी create कर सकते हैं , बस हमें namespace etc define करना होता है।

File : app/Http/Middleware/MyMiddleware.php

Copy Fullscreen Close Fullscreen
<?php 
namespace App\Http\Middleware;
use Closure;
class MyMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
       /* Perform Action : It will run before handling the request*/

       return $next($request);
       
       /* Perform Action : It will run after the request*/
    }
}

Middleware में एक handle method होता है जो request को return ( return $next($request) ) करता है, इसी method में हम अपना logic लिखते हैं।


handle method में return $next($request); statement से पहले लिखा गया code Request handle होने से पहले run होता है , जबकि return $next($request); के बाद लिखा गया code Request Handle hone के बाद run होता है

Laravel Registering Middleware

कोई भी Middleware Run होने के लिए उसका Register होना जरूरी है , बिना register किये वह Middleware Run नहीं होगा। सभी Middlwares को app/Http/Kernel.php file में Register किया जाता है।

Global Middleware

अगर आप चाहते हैं कि , Middleware हर एक Request के लिए run हो तो उसे Kernal.php Class की $middleware property में register करें।

/** inside app\Http\Kernel.php
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
  \App\Http\Middleware\TrustProxies::class,
  \App\Http\Middleware\CheckForMaintenanceMode::class,
  \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
  \App\Http\Middleware\TrimStrings::class,
  \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
  /*here list your middleware*/
];

Assigning Middleware To Routes

Routes के लिए Middleware Register करने के लिए आपको $routeMiddleware property में अपना Middleware लिस्ट करना होता है। यहां पर Middleware को एक key से associate किया जाता है , ताकि उसे key का use करके routes पर apply कर सकें। 

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,

    'mymiddleware' => \App\Http\Middleware\MyMiddleware::class,
];

एक बार $routeMiddleware Register होने के बाद उसे अपने route में use कर सकते हैं।

Route::get('testurl', 'Controller@method')->middleware('mymiddleware');

हालाँकि Middleware को आप routes में कई तरह से use कर सकते हैं , कुछ examples इस प्रकार हैं।

Route::get('/', function () {
    //
})->middleware('mymiddleware');

Or

Route::group(['middleware' => 'mymiddleware'], function () {
   /*do whatever you want*/
});

Or

Route::middleware(['mymiddleware'])->group(function () {
  /*do whatever you want*/
});

आपको जैसा easy लगे बैसे use करें।

Hey ! I'm Rahul founder of learnhindituts.com. Working in IT industry more than 4.5 years. I love to talk about programming as well as writing technical tutorials and blogs that can help to others .... keep learning :)

Get connected with me - LinkedIn Twitter Instagram Facebook