Middleware
Les middlewares interceptent les requêtes HTTP entrant dans votre application. Ils peuvent modifier la requête, la réponse, ou arrêter l'exécution (ex: Auth).
Créer un Middleware
Un middleware doit implémenter River\Middleware_interface.
namespace App\Middleware;
use River\Middleware_interface;
use River\Request;
use River\Response;
class EnsureAdmin implements Middleware_interface
{
public function handle(Request $request, callable $next): mixed
{
if ($request->get('user_role') !== 'admin') {
return Response::html('Accès interdit', 403);
}
// Passer au middleware suivant
return $next($request);
}
}
Enregistrement
Middleware Global
S'applique à toutes les requêtes. À définir dans Http_engine (via config ou provider).
Middleware de Route
S'applique à une route spécifique.
$router->get('admin', 'Admin::index')
->middleware(App\Middleware\EnsureAdmin::class);
Middleware Intégrés
River fournit déjà plusieurs middlewares essentiels :
Session_middleware: Démarre la session.Csrf_middleware: Vérifie les tokens CSRF.Auth_middleware: Protège les routes connectés uniquement.Guest_middleware: Protège les routes visiteurs uniquement.Role_middleware: Protège les routes par rôle (avec paramètres).Security_middleware: Ajoute les headers de sécurité (XSS, HSTS).Cors_middleware: Gère les requêtes Cross-Origin.Rate_limit_middleware: Protection contre le brute-force.
Middleware avec paramètres
Certains middlewares acceptent des paramètres, séparés par : (classe) puis , (valeurs).
use River\Middleware\Role_middleware;
// Un seul rôle
$router->get('admin', 'Admin::index')
->middleware(Role_middleware::class . ':admin');
// Plusieurs rôles (logique OR)
$router->get('admin', 'Admin::index')
->middleware(Role_middleware::class . ':admin,sysadmin');
Le format est Classe:param1,param2. Les paramètres sont transmis en arguments supplémentaires à handle().
Middleware de groupe
Appliquez un middleware à un ensemble de routes avec group().
use River\Middleware\Role_middleware;
$router->group([
'prefix' => 'admin',
'middleware' => Role_middleware::class . ':admin,sysadmin'
], function($r) {
$r->get('users', 'Admin\Users_ctrl::index');
$r->get('settings', 'Admin\Settings_ctrl::index');
});