Un middleware es un software que proporciona un enlace entre aplicaciones, sistemas o proyectos independientes. En otras palabras es un elemento que usamos como la vía para conectar dos aplicaciones o dos partes, su función es pasar datos entre ellas o de un lado a otro.
De hecho su significado es “medio” y lo fabricamos e implementamos en cualquier área, un middleware puede ser un hardware, este termino se usa desde hace varias décadas en informática.
Si hablamos de Laravel podemos decir que un middleware es un archivo que filtra las peticiones HTTP en un sistema, es un archivo adicional que va en el medio de la petición y de eso que se quiere ver como resultado final (un controlador, vista, archivo PDF o cualquier cosa). En otras palabras es una capa adicional donde podemos colocar la lógica de acceso.
En términos sencillos tenemos lo siguiente: Un middleware altera el flujo, este puede devolver la respuesta deseada o una redirección a una página de error, mensaje o estado HTTP.
namespaceApp\Http\Middleware;
useClosure;
classEjemploMiddleware{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/publicfunctionhandle($request, Closure $next){
return $next($request);
}
}
En temas prácticos podemos ver que un middleware se define en una clase y por cada restricción o regla vamos a tener una clase (un middleware).
Para crear esta clase debemos ejecutar el comando php artisan make:middleware EjemploMiddleware
y dicha clase se creará en la ruta App\Http\Middleware\EjemploMiddleware.php
.
Método handle()
.
@param \Illuminate\Http\Request $request
que se usa en los controladores, es la clase que que recibe los formularios y datos en general.$next
, un Closure que cumple con la función de ejecutar el siguiente middleware si la aplicación pasa correctamente este paso o middleware actual (si todo va bien entonces NEXT).Los middleware se ejecutan en cadena, si la petición no pasa o no se cumple algún middleware no llegamos al NEXT y se rompe la cadena. ¿Cuándo se rompe la cadena de middleware? Cuando no llegamos a la línea return $next($request);
o si llegamos al fin de la cadena de middleware.
Podemos comenzar entendiendo que tenemos una tabla de usuarios con un campo clave llamado subscribed
y es un boolean
. Aquí podemos ver que por defecto los usuarios no estarán suscritos pero es algo que podemos activar colocando un true
o el valor 1
.
//...classCreateUsersTableextendsMigration{
//...publicfunctionup(){
Schema::create('users', function(Blueprint $table){
//...
$table->boolean('subscribed')->default(false);
});
}
//...
}
Para este ejemplo necesitamos una clase específica, recuerda: Cada regla requiere de una clase (un middleware).
$ php artisan make:middleware Subscribed
Aquí podemos ver que creamos una clase para colocar directamente la lógica de acceso para los usuarios suscritos. Este se crea en app/Http/Subscribed.php
.
namespaceApp\Http\Middleware;
useClosure;
classSubscribed{
publicfunctionhandle($request, Closure $next){
if ($request->user()->subscribed) {
return $next($request);
}
return abort(403);
}
}
Estado 403: La solicitud fue legal y correcta pero el servidor no la responderá porque el cliente no tiene permisos o privilegios.
namespaceApp\Http;
useIlluminate\Foundation\Http\KernelasHttpKernel;
classKernelextendsHttpKernel{
//...protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'subscribed' => \App\Http\Middleware\Subscribed::class,
];
//...
}
Route::get('/courses', 'CourseController@index')->middleware('auth', 'subscribed');
Un middleware es una forma acertada de proteger a nuestras rutas, lo importante es definir qué queremos proteger y crear la lógica necesaria en un archivo o clase aparte (en un middleware). Puedes crear un if
y pegarlo donde necesites pero usamos a un middleware para aislar ese if
y usarlos las veces que sea necesaria sin duplicar el código.
En este caso nuestra lógica es: Si estás suscrito entonces NEXT, sino entonces error 403.
Recuerda que en Platzi cuentas con toda una ruta de Desarrollo Web Backend con PHP en donde seré tu profesor para que inicies con este emocionante lenguaje y desarrolles proyectos profesionales utilizando tecnologías como Laravel.
¡Nunca pares de aprender!
😃
siempre tiene que pasar por el middleware Auth?
no encontré nada del middleware en tu curso, tienes otro en donde lo expliques a fondo?