Skip to content

Leaf 5 โ€” Middleware Reference โ€‹

Global Middleware (all routes) โ€‹

php
// Closure โ€” Basic/Lite style
app()->use(function () {
    echo request()->getMethod() . ' ' . request()->getPath();
});

// Class โ€” MVC style
use App\Middleware\LogRequestMiddleware;
app()->use(LogRequestMiddleware::class);
app()->use(AnotherMiddleware::class);  // stack multiple

Route-Level Middleware โ€‹

php
// Named (registered globally)
app()->registerMiddleware('auth', function () {
    if (!auth()->user()) response()->redirect('/login');
});

app()->get('/home', ['middleware' => 'auth', function () { /* ... */ }]);

// Class
app()->get('/my-route', ['middleware' => LogRequestMiddleware::class, 'MyController@index']);

// Inline closure
$mw = function () { echo request()->getMethod(); };
app()->get('/home', ['middleware' => $mw, function () { echo 'Home'; }]);
app()->group('/admin', ['middleware' => $mw, function () {
    app()->get('/', function () { echo 'dashboard'; });
}]);

Use closures in Basic/Lite. Use classes in MVC.

MVC Middleware Class โ€‹

Generate with: leaf g:middleware LogRequest

php
namespace App\Middleware;
use Leaf\Middleware;

class LogRequestMiddleware extends Middleware {
    public function call() {
        $method = request()->getMethod();
        $uri    = request()->getPath();
        echo "[$method] $uri\n";
    }
}

Passing Data from Middleware โ†’ Handler โ€‹

Use response()->next() to pass data, request()->next() to read it. Data is consumed on first read and removed from the request lifecycle.

Closure version โ€‹

php
app()->registerMiddleware('logRequest', function ($next) {
    echo request()->getMethod();
    return response()->next('You can pass any value here');
});

app()->get('/home', ['middleware' => 'logRequest', function () {
    $data = request()->next();  // "You can pass any value here"
    echo $data;
}]);

MVC class version โ€‹

php
class LogRequestMiddleware extends Middleware {
    public function call($next) {
        echo request()->getMethod();
        return response()->next('You can pass any value');
    }
}

class MyController extends Controller {
    public function index() {
        $data = request()->next();  // "You can pass any value"
        echo $data;
    }
}