Flight admite middleware de ruta y de grupo de ruta. El middleware es una función que se ejecuta antes (o después) de la devolución de llamada de la ruta. Esta es una excelente manera de agregar verificaciones de autenticación de API en su código, o para validar que el usuario tiene permiso para acceder a la ruta.
Aquí tienes un ejemplo básico:
// Si solo proporciona una función anónima, se ejecutará antes de la devolución de llamada de la ruta. // no hay funciones de middleware "después" excepto para las clases (ver abajo) Flight::route('/path', function() { echo '¡Aquí estoy!'; })->addMiddleware(function() { echo '¡Middleware primero!'; }); Flight::start(); // ¡Esto mostrará "¡Middleware primero! ¡Aquí estoy!"
Hay algunas notas muy importantes sobre el middleware que debes tener en cuenta antes de usarlo:
Flight::redirect()
function($params) { ... }
public function before($params) {}
flight\Engine
__construct()
El middleware también se puede registrar como una clase. Si necesitas la funcionalidad "después", deb usar una clase.
class MyMiddleware { public function before($params) { echo '¡Middleware primero!'; } public function after($params) { echo '¡Middleware último!'; } } $MyMiddleware = new MyMiddleware(); Flight::route('/path', function() { echo '¡Aquí estoy! '; })->addMiddleware($MyMiddleware); // también ->addMiddleware([ $MyMiddleware, $MyMiddleware2 ]); Flight::start(); // Esto mostrará "¡Middleware primero! ¡Aquí estoy! ¡Middleware último!"
Digamos que tienes un middleware de autenticación y quieres redirigir al usuario a una página de inicio de sesión si no está autenticado. Tienes algunas opciones a tu disposición:
Aquí tienes un ejemplo simple de return false;:
class MyMiddleware { public function before($params) { if (isset($_SESSION['user']) === false) { return false; } // dado que es verdadero, todo continúa } }
Aquí tienes un ejemplo de redirigir al usuario a una página de inicio de sesión:
class MyMiddleware { public function before($params) { if (isset($_SESSION['user']) === false) { Flight::redirect('/login'); exit; } } }
Digamos que necesitas lanzar un error JSON porque estás construyendo una API. Puedes hacerlo de la siguiente manera:
class MyMiddleware { public function before($params) { $authorization = Flight::request()->headers['Authorization']; if(empty($authorization)) { Flight::jsonHalt(['error' => 'Debes iniciar sesión para acceder a esta página.'], 403); // o Flight::json(['error' => 'Debes iniciar sesión para acceder a esta página.'], 403); exit; // o Flight::halt(403, json_encode(['error' => 'Debes iniciar sesión para acceder a esta página.']); } } }
Puedes agregar un grupo de rutas, y luego cada ruta en ese grupo tendrá el mismo middleware también. Esto es útil si necesitas agrupar varias rutas por un middleware de autenticación para verificar la clave de API en el encabezado.
// añadido al final del método de grupo Flight::group('/api', function() { // Esta ruta con aspecto "vacío" en realidad coincidirá con /api Flight::route('', function() { echo 'api'; }, false, 'api'); // Esto coincidirá con /api/usuarios Flight::route('/usuarios', function() { echo 'usuarios'; }, false, 'usuarios'); // Esto coincidirá con /api/usuarios/1234 Flight::route('/usuarios/@id', function($id) { echo 'usuario:'.$id; }, false, 'user_view'); }, [ new ApiAuthMiddleware() ]);
Si deseas aplicar un middleware global a todas tus rutas, puedes agregar un grupo "vacío":
// añadido al final del método de grupo Flight::group('', function() { // Esto sigue siendo /usuarios Flight::route('/usuarios', function() { echo 'usuarios'; }, false, 'usuarios'); // Y esto sigue siendo /usuarios/1234 Flight::route('/usuarios/@id', function($id) { echo 'usuario:'.$id; }, false, 'user_view'); }, [ new ApiAuthMiddleware() ]);