middleware-con-parametros-laravel-5-1

¿Qué es un Middleware?

Los middleware, son funciones que nos permiten agregar filtros a cada petición HTTP realizada por un usuario en una aplicación.  La finalidad de este componente es disminuir la carga de trabajo en los controladores y proporcionar una solución mucho más simple y estándar a la hora de aplicar las restricciones necesarias en el proyecto. La versatilidad de los middleware te permite agregar restricciones por zona horaria, geolocalización, login, edad, genero, rol o tipo de usuario, y básicamente todo lo que quieras. esto te permite bloquear acceso a ciertas áreas de tu aplicación para un usuario o un grupo de usuarios en específico.

¿Cómo crear un Middleware?

Gracias a los comandos de artisan podemos crear nuestros propios middleware con una simple linea de código:

$ php artisan make:middleware AgeMiddleware

¡Listo! bueno, no del todo, con esto habrás creado un archivo llamado AgeMiddleware dentro de la carpeta app\Http\Middleware de tu aplicación. si abres este archivo verás el siguiente código:

<?php

namespace App\Http\Middleware;

use Closure;

class AgeMiddleware
{
    /**
     * Run the request filter.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }

}

Como puedes ver dentro de esta función puedes manejar peticiones de tipo Request, por lo que puedes recibir e interactuar con todos los parámetros enviados y decidir si el usuario podrá acceder al contenido o no. Por ejemplo imagina Youtube, Vimeo o HBO Go, donde hay videos para todas las edades, en tal caso, si el usuario tiene una propiedad «birthdate» y puedes calcular su edad a partir de dicha propiedad, puedes verificar si la persona tiene el mínimo de edad para ver el video, y entonces por ejemplo mandar un error 404, 403 o de otro tipo si el usuario no tiene la edad suficiente para ver el material en cuestión. Por ejemplo:

public function handle($request, Closure $next, $age)
{
    if ($request->user()->age <= $age) {
        abort(403, "¡No tienes edad para ver este video! le diremos a tus padres.");
    }
    return $next($request);
}

Nota que agregamos un tercer parámetro personalizado llamado $age al método handle

Piensa en los middleware como un puesto de vigilancia entre las rutas y los controladores en la que habrá un guardia de seguridad monitoreando todo lo que pasa por allí para ver si cumple con los requerimientos definidos.

Cómo registrar un middleware en nuestra aplicación

Una vez creado el Middleware, debes registrarlos en la aplicación para que puedan ser usados en las peticiones, para ello dentro del archivo app\Http\Middleware\Kernel.php y de la propiedad $routeMiddleware debemos registrar el Middleware que generamos en la consola, de esta forma:

    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        //este es el nuevo middleware
        'age' => \App\Http\Middleware\AgeMiddleaware::class,
    ];

Básicamente en este array defines un «alias» o nombre para el Middleware y la clase a la que éste apunta.

Cómo proteger una ruta utilizando un middleware

Es aquí donde viene la implementación en concreto, te diriges al archivo Routes.php y defines algo como esto:

Route::get('series/game-of-thrones/', ['middleware' => 'age:18', function () {
    return "eres mayor de edad y puedes ver este contenido"
}]);

Los parámetros (que son opcionales, algunos middleware requerirán parámetros mientras que otros no) se envían agregando dos puntos después del nombre del Middleware  y van separados por comas. Lo que sucede aquí es que agregamos una nueva llave al array de parámetros de la ruta para indicar que trabajará o será filtrado por un middleware llamado age, entonces cada vez que alguien quiera acceder a esta url deberá cumplir con estos requerimientos. De esta forma puedes agregar filtros sencillos de manera muy rápida en tu aplicación, pero si como yo eres de los que le gusta sacar el mayor provecho de los componentes de Laravel y quieres escribir Middleware mucho más potentes y geniales que te van a permitir desarrollar una aplicación segura, te invito a seguir el Curso introductorio de Laravel 5.1 y en especial la sección sobre middleware:

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Artisan signatures en Laravel 5.1 Lección siguiente Configuración de Git en proyectos de Laravel