middleware_laravel_blog

Qué son los Middlewares y cómo se usan en Laravel 5.1

Un middleware es un mecanismo que se utiliza para filtrar las peticiones HTTP en una aplicación. Están disponibles desde la versión 5 de Laravel y te permiten agregar capas adicionales a la lógica de tu aplicación.

El ejemplo mas común de un Middleware es el de autenticación. Este nos serviría, por ejemplo, en un sitio en donde es necesario iniciar sesión y tener ciertos privilegios para poder ver el contenido de determinadas páginas.

El Middleware de autenticación es tan común que incluso Laravel 5.1 lo incluye por defecto como lo podemos ver en la siguiente imagen.

Middleware Laravel 5.1

Cómo crear un middleware

Lo primero que debemos hacer es crear un proyecto de Laravel 5.1. Si aún no tienes instalada esta versión, puedes ver cómo hacerlo leyendo la documentación oficial.

Comando: laravel new middleware

Middleware Laravel 5.1

Para este ejemplo vamos a crear un Middleware básico que verifique el país del visitante y dependiendo de su ubicación, muestre o no el contenido de la página.

Usando Artisan creamos un nuevo middleware llamado CountryMiddleware utilizando el siguiente comando:

php artisan make:middleware CountryMiddleware

Middleware Laravel 5.1

De esta manera, se creará un nuevo archivo dentro del directorio app/Http/Middleware con el código inicial de nuestro Middleware; que se verá de la siguiente manera:

<?php

namespace App\Http\Middleware;

use Closure;

class CountryMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

Creando una nueva ruta

Aunque nuestro Middleware ya fue creado, aún no hace nada ni está siendo usado en algún lado. Así que es momento de crear una nueva ruta protegida. Eso quiere decir que antes de mostrar su contenido, se ejecutará el CountryMiddeware que creamos previamente. A esta ruta, le llamaremos dashboard.

<?php

/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/

Route::get('/', function () {
    return view('welcome');
});

Route::get('dashboard', ['middleware' => 'country', function(){
    return '<h1>Bienvenido!!</h1>';
}]);

Registrando nuestro middleware

Si en este momento ingresamos a la ruta creada en el paso anterior (http://tuproyecto.dev/dashboard), Laravel nos mostrará un error indicándonos que la clase country no existe. Esto es correcto ya que aún no hacemos el registro de nuestro Middeware.

Middleware Laravel 5.1

Existen dos tipo de Middlewares: los globales y los específicos por ruta. Ambos se registran en el archivo Kernel.php ubicado en app/Http.

Los Middlewares globales se ejecutan en cada petición que se hace a la aplicación sin importar la ruta a la que se accede. Estos se declaran en el array $middleware que se encuentra dentro de la clase Kernel.php.

<?php
    /**
     * The application's global HTTP middleware stack.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ];

Los Middlewares específicos por ruta son aquellos que, como su nombre lo indica, sólo se ejecutan en las rutas en la que se especifican. Estos se declaran en el array $routeMiddleware dentro del mismo archivo Kernel.php y es aquí donde nosotros agregaremos nuestro CountryMiddleware.

<?php
    /**
     * The application's route middleware.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'country' => \App\Http\Middleware\CountryMiddleware::class
    ];

En este punto deberíamos poder acceder a la ruta (http://tuproyecto.dev/dashboard) sin problema alguno y sin que nos marque algún error. Sin embargo, nuestro Middleware sigue sin hacer nada.

Para que empiece a funcionar, vamos a agregar una comprobación que verifique el nombre del país y si es igual a México nos mostrará la pagina; de lo contrario, nos enviará al home del sitio.

<?php

namespace App\Http\Middleware;

use Closure;

class CountryMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $country = 'Mexico';
        if( $country == 'Mexico' ){
            return $next($request);
        }
        return redirect('/');
    }
}

Pasando parámetros al middleware

Hasta este punto logramos crear un Middleware sencillo y entendimos cómo funcionan. Sin embargo, en Laravel 5.1 se añadió una nueva característica que permite pasar parámetros a los Middlewares. ¡Vamos a ponerla en práctica!

Siguiendo con el ejemplo, ahora debemos agregar el nombre del parámetro que queremos recibir en la función handle de nuestra clase CountryMiddleware.

<?php

namespace App\Http\Middleware;

use Closure;

class CountryMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, $country)
    {
        if( $country == 'Mexico' ){
            return $next($request);
        }
        return redirect('/');
    }
}

Ahora sólo nos queda enviar el valor de este parámetro. Esto lo debemos hacer desde nuestra ruta:

<?php

/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/

Route::get('/', function () {
    return view('welcome');
});

Route::get('dashboard', ['middleware' => 'country:Mexico', function(){
    return '<h1>Bienvenido!!</h1>';
}]);

¡Y listo! Ahora ya sabes qué es un Middleware y cómo pasar parámetros usando Laravel 5.1.

Puedes encontrar el código fuente de este proyecto en GitHub y si te interesa conocer más a fondo las nuevas características que introdujo la versión 5.1, no te pierdas muy pronto el completamente renovado Curso de PHP con Laravel de Platzi.

Entrar al curso de PHP y Laravel