Silex, el manual oficial

3.1. Los middlewares de aplicación

Estos middlewares solo se ejecutan para las peticiones de tipo master. Esto significa que no se tienen en cuenta en las subpeticiones que se crean para realizar los forwards.

3.1.1. El middleware before

El middleware de aplicación before te permite modificar el objeto Request antes de que se ejecute el controlador:

$app->before(function (Request $request, Application $app) {
    // ...
});

Por defecto este middleware se ejecuta después del enrutamiento y de la capa de seguridad.

Si quieres ejecutar este middleware incluso para las excepciones (por ejemplo cuando se produce un error de tipo 404 o 403) tienes que añadir lo siguiente al registrarlo:

$app->before(function (Request $request, Application $app) {
    // ...
}, Application::EARLY_EVENT);

Como en este caso no se ejecuta ni el enrutamiento ni la capa de seguridad, no tienes acceso ni al idioma del usuario, ni a la ruta actual ni al objeto de seguridad que representa al usuario.

Nota El middleware before utiliza internamente el evento request de Symfony.

3.1.2. El middleware after

El middleware de aplicación after te permite modificar el objeto Response antes de que se genere la respuesta enviada al usuario:

$app->after(function (Request $request, Response $response) {
    // ...
});

Nota El middleware after utiliza internamente el evento response de Symfony.

3.1.3. El middleware finish

El middleware de aplicación finish te permite ejecutar código después de haber enviado el objeto Response al usuario, por lo que es ideal para tareas como enviar emails o guardar mensajes de log:

$app->finish(function (Request $request, Response $response) {
    // ...
    // ten en cuenta que cualquier cambio que hagas en Request
    // o Response se ignorará, porque la respuesta ya se ha
    // enviado al usuario
});

Nota El middleware finish utiliza internamente el evento terminate de Symfony.