Mayo 19, 2014
enzo
Hoy quiero compartirles acerca de los Middlewares de Silex o filtros como a veces es traducido en español. Los Middlewares son breakpoints que permiten que se modifique el comportamiento normal de Silex en diferentes etapas durante el proceso de atender una solicitud.
- Secuencia de ejecución Silex.
A continuación veamos la secuencia de ejecución de Silex.
- Identificar Ruta
- Chequeo de seguridad
- Ejecución de Middleware before()
- Ejecutar controlador de la ruta
- Ejecutar Middleware after()
- Enviar respuesta al usuario
- Ejecutar Middleware finish()
- Breackpoint before().
Como se vio en el esquema de ejecución de Silex mediante el Middlewares before es posible realizar acciones que afecten la ejecución de las rutas, veamos un ejemplo.
$app->before(function (Request $request) {
$app['monolog']->addDebug('Before define Routes.');
});
La función anterior que utiliza Monolog el cual fue explicado en la entrada de blog Agregar sistema de logs a Silex es ejecutada justo antes que el controlador asociado a la ruta solicitada sea ejecutado.
- Breackpoint after().
Este Middlewares es ejecutado cuando el controlador asociado a la ruta seleccionada por el usuario ha sido ejecutado, pero justo antes de que se le entregue los resultados al usuario, veamos un ejemplo.
$app->after(function (Request $request, Response $response) {
// YOUR LOGIC
});
Este Middlewares es ideal para que podamos modificar el objecto $response antes de que sea entregado al usuario.
- Breackpoint finish();
Este Middlewares es ideal para realizar acciones que se pueden llevar acabo después de entregar una respuesta al usuario como por ejemplo enviar un correo electrónico o grabar estadísticas, al ejecutarse luego de entregar los datos al usuario esto no afectaría en nada el desempeño, veamos un ejemplo.
$app->finish(function (Request $request, Response $response) {
$app['monolog']->addDebug('Register Stats.');
mail('emaild@example.com', 'My Subject', $message);
});
- Aplicar Middlewares a enrutamientos específicos.
La lógica explicada anteriormente se aplica automáticamente a todos los enrutamientos presentes en nuestra aplicación Silex, pero que pasa si solo deseamos que estos Middlewares se ejecuten a ciertas rutas.
Bueno es posible como se muestra a continuación.
$before1 = function (Request $request, Application $app) {
// ...
};
...
....
$app->get('/rest/clients', function() use ($app) {
$app['monolog']->addWarning('Start');
$clients = array(
array(
'id' => 1,
'name' => 'HP'
),
array(
'id' => 1,
'name' => 'IBM'
),
array(
'id' => 1,
'name' => 'Google'
),
);
$app['monolog']->addError('End');
return $app->json($clients);
})->before($before1)
->before($before2)
->after($after1)
->after($after2);
Como se puede observar se pueden aplicar multiples Middlewares a una misma ruta, como también se podrían declarar varios Middlewares de un mismo tipo en nuestra aplicación, si deseas conocer mas acerca del enrutamiento en Silex te invito a ver la entrada de blog Enrutamiento en Silex.
En el ejemplo anterior los Middlewares se definieron mediante funciones lamda, puedes aprender mas de esto en la entrada de blog Funciones anónimas en PHP.
Espero que haya sido de su agrado.