bienes

Laravel middleware cómo funciona

El middleware de Laravel es una capa de aplicación intermedia que interviene entre la solicitud del usuario y la respuesta de la aplicación.

Esto significa que cuando el usuario (vista de Laravel) realiza una solicitud al servidor (controlador de Laravel), la solicitud pasará por el middleware. De esta forma, el middleware puede verificar si la solicitud está autenticada o no: 

  • si la solicitud del usuario está autenticada, la solicitud se envía al backend;
  • si la solicitud del usuario no está autenticada, el middleware redirigirá al usuario a la pantalla de inicio de sesión.

Laravel te permite defifinalizar y usar middleware adicional para realizar una variedad de tareas, excepto la autenticación. 

Los middlewares de Laravel, como la autenticación y la protección CSRF, se encuentran en el directorio aplicación/Http/Middleware .

Por lo tanto, podemos decir que el middleware es un filtro de solicitud http, a través del cual es posible verificar condiciones y realizar acciones.

Creación de software intermedio

Para crear un nuevo middleware ejecutamos el siguiente comando:

php artisan make:middleware <name-of-middleware>

Creamos el middleware y lo llamamos CheckAge, artisan nos responderá de la siguiente manera:

La ventana de arriba muestra que el middleware se ha creado correctamente con el nombre " Edad de verificación ".

Para ver si el middleware CheckAge está creado o no, vaya al proyecto en la carpeta app/Http/Middleware y verá el archivo recién creado.

El archivo recién creado tiene el siguiente código

<?php

namespace App\Http\Middleware;

use Closure;

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

Usar software intermedio

Para usar middleware, necesitamos registrarlo.

Hay dos tipos de middleware en Laravel:

  • Middleware globale
  • Route Middleware

Il software intermedio global se ejecutará en cada solicitud HTTP de la aplicación, mientras que el Middleware de ruta se asignará a una ruta específica. El middleware se puede registrar en aplicación/Http/Kernel.php. Este archivo contiene dos propiedades. $middleware e $rutaMiddleware . La propiedad $middleware se utiliza para registrar middleware global y propiedad $rutaMiddleware se utiliza para registrar middleware específico de la ruta.

Para registrar el middleware global, enumere la clase al final de la propiedad $middleware.

protected $middleware = [
        \App\Http\Middleware\TrustProxies::class,
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

Para registrar el middleware específico de la ruta, agregue la clave y el valor a la propiedad $routeMiddleware.

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];

Nosotros creamos Edad de verificación en el ejemplo anterior. Ahora podemos registrar esto en la propiedad de ruta del middleware. El código para dicho registro se muestra a continuación.

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'Age' => \App\Http\Middleware\CheckAge::class,
    ];

Parámetros de software intermedio

También podemos pasar parámetros con Middleware. 

Por ejemplo, si su aplicación tiene diferentes roles como usuario, administrador, superadministrador, etc. y desea autenticar la acción según el rol, puede hacerlo pasando los parámetros con el middleware. 

El middleware que creamos contiene la siguiente función y podemos pasar argumentos personalizados después del argumento $siguiente .

    public function handle($request, Closure $next)
    {
        return $next($request);
    }

Ahora intentemos establecer el parámetro de rol en un nuevo middleware que vamos a crear desde cero, luego procedamos a crear Role Middleware ejecutando el siguiente comando

Modifique el método handle de la siguiente manera

<?php

namespace App\Http\Middleware;
use Closure;

class RoleMiddleware {
   public function handle($request, Closure $next, $role) {
      echo "Role: ".$role;
      return $next($request);
   }
}

agregamos el parámetro $role, y dentro del método la línea echo para escribir en la salida el nombre del rol.

Boletín de innovación
No te pierdas las noticias más importantes sobre innovación. Regístrese para recibirlos por correo electrónico.

Ahora registremos el middleware RoleMiddleware para una ruta específica

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'Age' => \App\Http\Middleware\CheckAge::class,
        'Role' => \App\Http\Middleware\RoleMiddleware::class,
    ];

Ahora, para probar el middleware con el parámetro, necesitamos crear una solicitud y una respuesta. Para simular la respuesta vamos a crear el controlador al que llamaremos TestController

php artisan make:controller TestController --plain

el comando recién ejecutado creará un nuevo controlador dentro de la carpeta app/Http/TestController.phpy cambiar el método index con la línea echo "<br>Test Controller.";

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class TestController extends Controller {
   public function index() {
      echo "<br>Test Controller.";
   }
}

Después de configurar la respuesta, construimos la solicitud editando el archivo routes.phpagregando el route role

Route::get('role',[
   'middleware' => 'Role:editor',
   'uses' => 'TestController@index',
]);

en este punto podemos probar el ejemplo visitando la URL http://localhost:8000/role

y en el navegador veremos los dos echo

Role editor
Test Controller

Middleware cancelable

Il terminable Middleware realiza algunas tareas después de enviar la respuesta al navegador. Esto se puede lograr creando un middleware con el método terminar en el middleware. Il terminable Middleware debe estar registrado en el middleware global. El método terminate recibirá dos argumentos $ solicitud e $respuesta. 

El método Terminate debe crearse como se muestra en el siguiente código.

php artisan make:middleware TerminateMiddleware

Una vez creado el middleware app/Http/Middleware/TerminateMiddleware.php vamos a modificar el código de la siguiente manera

<?php

namespace App\Http\Middleware;
use Closure;

class TerminateMiddleware {
   public function handle($request, Closure $next) {
      echo "Executing statements of handle method of TerminateMiddleware.";
      return $next($request);
   }
   
   public function terminate($request, $response) {
      echo "<br>Executing statements of terminate method of TerminateMiddleware.";
   }
}

en este caso tenemos un método handle y un metodo terminate con los dos parametros $request e $response.

Ahora vamos a registrar el Middleware

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'Age' => \App\Http\Middleware\CheckAge::class,
        'Role' => \App\Http\Middleware\RoleMiddleware::class,
        'terminate' => \App\Http\Middleware\TerminateMiddleware::class,
    ];

Ahora necesitamos crear el controlador para simular la respuesta.

php artisan make:controller XYZController --plain

modificando el contenido de la clase

class XYZController extends Controller {
   public function index() {
      echo "<br>XYZ Controller.";
   }
}

Ahora tenemos que editar el archivo. routes/web.php agregando las rutas necesarias para activar la solicitud

Route::get('terminate',[
   'middleware' => 'terminate',
   'uses' => 'XYZController@index',
]);

en este punto podemos probar el ejemplo visitando la URL http://localhost:8000/terminate

y en el navegador veremos las siguientes lineas

Executing statements of handle method of TerminateMiddleware
XYZController
Executing statements of terminate method of TerminateMiddleware

Ercole Palmeri

Usted también puede estar interesado en:

Boletín de innovación
No te pierdas las noticias más importantes sobre innovación. Regístrese para recibirlos por correo electrónico.

Artículos recientes

Principio de segregación de interfaces (ISP), cuarto principio SÓLIDO

El principio de segregación de interfaces es uno de los cinco principios SÓLIDOS del diseño orientado a objetos. Una clase debería tener...

14 2024 mayo

Cómo organizar mejor los datos y las fórmulas en Excel para un análisis bien hecho

Microsoft Excel es la herramienta de referencia para el análisis de datos, porque ofrece muchas funciones para organizar conjuntos de datos,…

14 2024 mayo

Conclusión positiva para dos importantes proyectos de Walliance Equity Crowdfunding: Jesolo Wave Island y Milano Via Ravenna

Walliance, SIM y plataforma líder en Europa en el campo del Crowdfunding Inmobiliario desde 2017, anuncia la finalización…

13 2024 mayo

¿Qué es el filamento y cómo utilizar el filamento Laravel?

Filament es un marco de desarrollo "acelerado" de Laravel que proporciona varios componentes completos. Está diseñado para simplificar el proceso de...

13 2024 mayo

Bajo el control de las Inteligencias Artificiales

«Debo volver para completar mi evolución: me proyectaré dentro del ordenador y me convertiré en energía pura. Una vez instalado…

10 2024 mayo

La nueva inteligencia artificial de Google puede modelar ADN, ARN y "todas las moléculas de la vida"

Google DeepMind presenta una versión mejorada de su modelo de inteligencia artificial. El nuevo modelo mejorado proporciona no sólo...

9 2024 mayo

Explorando la arquitectura modular de Laravel

Laravel, famoso por su sintaxis elegante y potentes funciones, también proporciona una base sólida para la arquitectura modular. Allá…

9 2024 mayo

Cisco Hypershield y adquisición de Splunk Comienza la nueva era de la seguridad

Cisco y Splunk están ayudando a los clientes a acelerar su viaje hacia el Centro de Operaciones de Seguridad (SOC) del futuro con...

8 2024 mayo