🚥 Middlewares
Introduction
Les middlewares constituent un mécanisme pratique pour filtrer les requêtes HTTP entrant dans votre application.
Par exemple, vous pouvez faire un middleware pour vérifier si un utilisateur est connecté et ensuite faire une action en fonction. Vous pouvez exécuter du code avant et après votre application Bow pour manipuler les objets Request et Response comme bon vous semble.
Comment ça marche
Différents frameworks utilisent le système de middlewares différemment. Bow ajoute un middleware sous forme de file d'attente au-dessus de votre application principale. Chaque nouvelle couche de middleware est ajoutée à la file de middlewares existante. La structure de file se dilate vers l'extérieur au fur et à mesure que les couches intermédiaires supplémentaires sont ajoutées.
Lorsque vous exécutez l'application Bow, les objets Request traversent la structure du middleware de l'extérieur vers l'intérieur. Ils entrent d'abord dans le middleware le plus externe, puis dans le prochain middleware le plus externe (et ainsi de suite), jusqu'à ce qu'ils atteignent l'application elle-même. Une fois que l'application Bow a distribué la route appropriée, l'objet Response résultant quitte l'application Bow et est sérialisé dans une réponse HTTP qui est renvoyée au client HTTP.
La seule condition stricte est qu'un middleware doit renvoyer une valeur autre que null. Chaque middleware devra appeler le middleware suivant et lui transmettre les objets Request comme arguments via la méthode $next.
Bow inclut plusieurs middlewares par défaut comme le middleware csrf et auth.
Ajouter un middleware
Pour ajouter un middleware il faut utiliser la commande add:middleware de php bow:
php bow add:middleware IpMiddleware
Tous les middlewares sont sauvegardés par défaut dans le dossier app/Middlewares.
Le middleware que nous venons d'ajouter vérifiera l'adresse IP du client et si son adresse est égale à 127.0.0.1, on dira que l'application est en mode développement.
Mais d'abord, regardons le contenu du fichier IpMiddleware. C'est la méthode process qui permet de lancer le middleware et le callable permet de lancer le prochain middleware.
namespace App\Middlewares;
use Bow\Http\Request;
class IpMiddleware
{
/**
* Fonction de lancement du middleware.
*
* @param Request $request
* @param callable $next
*/
public function process(Request $request, callable $next)
{
//
return $next($request);
}
}
Pour notre exemple on aura alors le process suivant:
public function process(Request $request, callable $next)
{
if ($request->ip() == '127.0.0.1') {
return "MODE DEV";
}
return $next($request);
}
Enregistrement de middleware
Généralement, l'enregistrement se fait dans le fichier app/Kernel.php avec une clé qui l'identifie.
public function middlewares()
{
return [
...
'ip' => \App\Middlewares\IpMiddleware::class
...
];
}
Il est aussi possible d'ajouter les middlewares de façon globale dans l'application. Ceci se fait dans le fichier de routes avec la méthode middleware sur $app qui va nous retourner une instance de \Bow\Router\Router::class. Toutes les routes qui seront définies avec cette instance hériteront des middlewares spécifiés.
$router = $app->middleware(\App\Middlewares\IpMiddleware::class);
$router->get('/', 'HomeController::index');
// Ou
$router = $app->middleware([
\App\Middlewares\IpMiddleware::class,
\App\Middlewares\OtherMiddleware::class,
]);
$router->get('/', 'HomeController::index');
Utilisation des middlewares
Après avoir défini un middleware dans le fichier app/Kernel.php, vous pouvez l'appliquer à vos routes.
$app->get('/', 'HomeController::index')->middleware('ip');
$app->get('/', 'HomeController::index')->middleware(['ip', 'autre']);
// ou
$app->route([
'path' => '/',
'method' => 'GET',
'handler' => 'HomeController::index',
'middleware' => ['ip', 'autre']
]);
Il manque quelque chose ?
Si vous rencontrez des problèmes avec la documentation ou si vous avez des suggestions pour améliorer la documentation ou le projet en général, veuillez déposer une issue pour nous, ou envoyer un tweet mentionnant le compte Twitter @bowframework ou sur directement sur le github.