Online interview questions

Prepare interviews on Anything, AnyWhere

PHPSCOTS
PHPSCOTS
Blogger, Developer

Laravel 5.5 Middleware complete Tutorial

Laravel 5.5 Middleware complete Tutorial

Hope you are doing great. You are here because you want to explore new possibilities to create robust and scalable PHP application using Laravel Framework.In this tutorial, we are going to cover topic’s like

What are middlewares in Laravel

In Laravel, you can think middleware as a system or tool that are used to filter all HTTP requests entering your application.Middleware works between request and response of our application.It sits between Request and Response like a firewall that examine whether to route a request.Laravel comes with several inbuilt middlewares like EncryptCookies ,RedirectIfAuthenticated,TrimStrings,TrustProxies etc . All middlewares are located in the app/Http/Middleware directory of laravel App.

Types of middlewares in laravel?

There are three types of middleware are available in Laravel.

How to use middleware in laravel 5

Global Middleware: They run on every HTTP request of application.Can be assigned in “$middleware” array of Kernel class which is located at 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 = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
        \App\Http\Middleware\YourMiddleare::class,
    ];

Route Middleware groups: They run on a specific route groups of application and can be assigned by listing your middleware class in “$middlewareGroups” array of Kernel class which is located at app/Http/Kernel.php.

   /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            \App\Http\Middleware\YourMiddleare::class,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

Route Middleware: They run on a specific route of application.To assign route middleware on specific routes, you should first assign your middleware a key with class in “$routeMiddleware” array of your app/Http/Kernel.php file.

   /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
	'YourMiddleare' => \App\Http\Middleware\YourMiddleare::class,
    ];

Once the middleware has been assigned in $routeMiddleware array of the HTTP kernel, you may use the middleware method to assign middleware to a route:

Route::get('admin/profile', function () {
    //
})->middleware('auth');

How to create custom middleware in Laravel 5.5?

As we have understand the basics of Middleware in Laravel now its time to create a custom Middleware in Laravel.
In this post, we are going to create a custom middleware in Laravel to redirect a visitor to a country subdomain based on location, if the visitor is not coming from the US. Many of e-commerce website do such type of task to personalized user experience based on their location.This middleware is helpful to do so. Lets started, follow the steps with me

I am assuming you have already installed Laravel 5.5 on your server, if not please click here to install and configure Laravel 5.5

Step 1: Creating our middleware:

In Laravel you create a new middleware, using the make:middleware Artisan command:

php artisan make:middleware locationRedirect 

Above command will a new php file named locationRedirect.php in app/Http/Middleware directory. Open your locationRedirect.php file and put below code in that.

<?php
namespace App\Http\Middleware;
use Closure;
use Request;
class locationRedirect
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
       // getting user country based on ip address
        $ip= $request->ip();
        $user_country_code="us";
        $ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" . $ip));
        if (@strlen(trim($ipdat->geoplugin_countryCode)) == 2) {
             $user_country_code= @$ipdat->geoplugin_countryCode;
         }
         if($user_country_code!=null &&  $user_country_code !="us"){
           $user_domain=$user_country_code."yourdomain.com";
           return return Redirect::to($user_domain);
         }
        return $next($request);
    }
}

?>

Now we need to register and create aliase for our middleware in Kernel.php file so please open app/Http/Kernel.php and add our middleware in $routeMiddleware array.

<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
	
     /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
      // \App\Http\Middleware\locationRedirect::class, // uncomment for global usage
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
	'locationRedirect' => \App\Http\Middleware\locationRedirect::class, // for specific route
    ];
}
?>

Now our custom Middleware locationRedirect is configured and ready to use in our app for specific routes. If you want to use this middleware globally then please uncomment ” // \App\Http\Middleware\locationRedirect::class, // uncomment for global usage” line from $middleware array of app/Http/Kernel.php. For specific route do as below.


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

Thanks for reading.

Please let me know if article helps you or if you have any doubts and suggestion please post a comment!