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 :

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');
});