Documentación

Middleware

Contenido

  1. Introducción
  2. Puntos de ejecución de middleware
  3. Crear un middleware
  4. Asignar un middleware
    1. Middleware global
    2. Middleware de ruta
  5. Ejecutar un middleware
    1. Parámetros de middleware
    2. Middleware externo

Introducción

Piensa en el middleware como una serie de capas que deben atravesar las solicitudes hechas a un recurso de tu aplicación para poder llegar a él.

Con el middleware puedes, por ejemplo, validar que un usuario esté logueado y tenga permisos suficientes para de acceder a ciertas secciones de tu aplicación, y redirigirlo a otro lugar en caso contrario.

El middleware es, de hecho, una extensión del controlador, porque el singleton del framework ya se ha construído en este punto y puedes obtenerlo usando la funcion ci().

Puntos de ejecución de middleware

Están disponibles dos puntos de ejecución:

  • pre_controller: el middleware definido en este punto se ejecutará después del constructor del controlador, PERO antes de que cualquier acción del controlador sea efectuada.
  • post_controller: el middleware definido en este punto se ejecutará exactamente en el hook post_controller nativo de CodeIgniter.
El constructor del controlador siempre se ejecuta primero
Este es el comportamiento de CodeIgniter y Luthier CI no lo modifica.

Es posible que en algún momento requieras ejecutar código antes del middleware, la manera de hacerlo es definiendo un método público en tu controlador llamado preMiddleware:

<?php
# application/controllers/TestController.php

defined('BASEPATH') OR exit('No direct script access allowed');

class TestController extends CI_Controller
{
    public function preMiddleware()
    {
        // Esto se ejecutará después del constructor (si existe), pero antes del middleware
    }
}
No disponible en funciones anónimas como rutas
Cuando usas funciones anónimas como rutas no existe una forma de ejecutar código arbitrario antes del middleware

Crear un middleware

Todo el middleware debe guardarse en la carpeta application/middleware. Un middleware es cualquier clase PHP que implemente la interfaz Luthier\MiddlewareInterface, con un método público llamado run().

Ejemplo:

<?php
# application/middleware/TestMiddleware.php

class TestMiddleware implements Luthier\MiddlewareInterface
{
    public function run()
    {
        // Este es el punto de entrada del middleware
    }
}
Implementar la interfaz MiddlewareInterface será obligatorio
A partir de la versión 0.3.0 el uso de clases de Middleware que no implementen la interfaz Luthier\MiddlewareInterface está OBSOLETO y dejará de funcionar en la próxima versión

Para poder asignar un middleware en tu aplicación es necesario que tanto el nombre de la clase como el nombre el archivo sean exactamente iguales. Además, debes tener cuidado de no usar el mismo nombre de algún otro recurso del framework, como un controlador, modelo, librería, etc.

Añade el sufijo Middleware
Una forma de evitar conflictos es añadiendo el sufijo Middleware al nombre del middleware.
Crea un middleware desde la linea de comandos
Si has activado las herramientas CLI integradas de Luthier CI, usa el comando luthier make middleware [nombre] para crear un nuevo middleware

Asignar un middleware

Puedes asignar un middleware en diferentes contextos de tu aplicación:

Middleware global

Para definir un middleware en un contexto global, la sintaxis es la siguiente:

Route::middleware([name], [exec_point?]);

Donde name es el nombre del middleware y exec_point es el punto de ejecución, que por defecto es pre_controller.

Puedes usar una función anónima en lugar del nombre de un middleware:

Route::middleware(function(){
    ci()->load->view('global_header');
});

Middleware de ruta

En el contexto de un grupo de rutas, el middleware es otra propiedad más, así que va en el segundo argumento del método group():

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

});

Por último, en el contexto de una ruta individual, el middleware es también otra propiedad más, así que va en el tercer argumento:

Route::put('foo/bar','controller@method', ['middleware' => ['TestMiddleware']]);
Sólo en el punto pre_controller
Cuando asignas un middleware a rutas y grupos de rutas, el punto de ejecución SIEMPRE es pre_controller

Ejecutar un middleware

Para ejecutar un middleware desde un controlador usa el método run() de la propiedad middleware:

<?php
# application/controllers/TestController.php

defined('BASEPATH') OR exit('No direct script access allowed');

class TestController extends CI_Controller
{
    public function __construct()
    {
        $this->middleware->run('AuthMiddleware');
    }
}

Parámetros de middleware

El método run() de la propiedad middleware admite un segundo argumento con los parámetros del middleware:

// $args puede ser cualquier tipo de variable:

$args = ['foo' => 'bar'];
$this->middleware->run('AuthMiddleware', $args);

Middleware externo

Es posible ejecutar middleware a partir de una clase externa, siempre y cuando posea un método público llamado run()

<?php
# application/controllers/TestController.php

defined('BASEPATH') OR exit('No direct script access allowed');

use Vendor\CustomMiddleware;

class TestController extends CI_Controller
{
    public function __construct()
    {
        $this->middleware->run(new CustomMiddleware());
    }
}

Autor: Anderson Salas. Última modificación: 24-06-2018

El texto, las ilustraciones y los ejemplos están disponibles bajo una licencia Creative Commons CC BY 4.0 (Más información)