Crear middleware en Laravel

En este artículo veremos qué es y como crear middlewares para nuestra aplicación laravel y veremos un uso muy útil de éstos, como puede ser el control de nuestras rutas cuando se encuentre en mantenimiento nuestra página.

¿Qué son los middleware en laravel?


Un middleware en laravel es una clase que funciona como filtro en las rutas, es decir, podemos añadirle a nuestra ruta o grupo de rutas un middelware para restringir por ejemplo el acceso a éstas si un usuario no está autentificado en nuestra aplicación, como podrían ser las rutas donde el administrador gestiona su aplicación laravel.

El middleware más conocido y utilizado en laravel es uno de los que ya vienen creado por defecto, que es el middleware authenticate, que controla si un usuario esta logeado en nuestra aplicación. Si añadiesemos el middleware de autenticación en nuestras rutas y el middleware comprobase que el usuario no esta autenticado lo redireccionaría por defecto a la ruta de login.

¿Como crear nuestro middelware en laravel?


Para este ejemplo vamos a crear un middelware (Laravel ya viene con un middelware vacio para esto, pero así vemos como crear unos desde cero) que comprobará si nuestra aplicación esta en modo mantenimiento y de ser así redireccionaría al usuario a la vista donde aparecerá el mensaje de mantenimiento que crearemos más adelante.

Ahora nuestro crearemos nuestro middelware, que llamaremos «Maintenance», con el siguiente comando en nuestra consola:

php artisan make:middleware Maintenance


Una vez ejecutado este comando, lo encontraremos en la carpeta Middleware que se encuentra en la ruta  app/http/Middleware con el nombre de Maintenance.php. Ahora vamos a registrar el middleware en nuestra aplicación, para ello iremos a Kernel.php que se encuentra en la carpeta App/Http y nos dirijimos abajo del todo y añadimos en el array $routeMiddelware nuestro nuevo middelware:

protected $routeMiddleware = [
   ...
   ...
   'maintenance' => \App\Http\Middleware\Maintenance::class,
];


Ahora vamos a crear una nueva tabla en nuestra base de datos que será la encargada de guardar nuestra configuración de la aplicacion, como el mantenimiento de la página:

public function up()
{
   Schema::create('configurations', function (Blueprint $table) {
     $table->increments('id');
     $table->string('name');
     $table->boolean('state');
     $table->timestamps();
    });
}


Y guardaremos en nuestra tabla algo así, donde la columna state será el estado del mantenimiento (1 En mantenimiento, 0 No está en mantenimiento):

Una vez hecho esto, iremos a nuestro middleware app/http/Middleware y añadiremos este código:

<?php

namespace App\Http\Middleware;
use Illuminate\Support\Facades\Auth;
use Closure;
use App\Configuration; //Recordar el modelo configuration para poder llamar a nuestra tabla

class Maintenance
 {
 /**
 * Handle an incoming request.
 *
 * @param \Illuminate\Http\Request $request
 * @param \Closure $next
 * @return mixed
 */
  public function handle($request, Closure $next)
   {
     if(Configuration::where(name, "mantenimiento")->state && !Auth::check()){
        return redirect('/mantenimiento');
      }
     return $next($request);
   }
 }


En la función handle añadimos la siguiente condición: «Si nuestra página está en modo mantenimiento y no estamos logeados, redirecciona a la ruta de mantenimiento». Añadimos la comprobación de auth:check para comprobar si estamos logeados,en este caso damos por hecho que  solo el administrador puede logearse, si cualquier usuario pudiese registrarse a nuestra página entonces deberiamos cambiar esta condición y añadir si el usuario que esta logeado no es administrador.

Ahora iremos a nuestro archivo web.php que es donde se administran nuestra rutas y añadiremos nuestro middleware:

Route::group(['middleware' => ['maintenance']], function () {

/*Todas las rutas que esten en este grupo estaran restringidas si nuestro aplicacion esta
en mantenimiento y se restringira su paso si la pagina esta en mantenimiento.*/

 Route::get('/', function () {
   return view('welcome');
 });
 Route::get('/sobre-nosotros', function () {
   return view('about');
 });
 Route::get('/contactar', function () {
   return view('contact');
 });
});

//esta es la ruta a la que redireccinaremos si esta en mantenimiento, habría que crear la vista maintenance o como quieras llamarla.

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


Después de esto, solo quedaría crear una vista que mostrase un mensaje tipo : «Esta página esta en mantenimiento, vuelve pronto».

De esta forma ya tendriamos nuestro middelware listo.

Cualquier duda ¡contacta con nosotros! ¡Nos vemos pronto!