Middleware provides a convenient mechanism to inspect and filter HTTP requests before they reach your controllers. Common use cases include authentication, authorization, logging, and request validation.
Middleware acts as a barrier between the router and your controller. When a route has middleware attached, the middleware’s handle() method is executed first:
Create your own middleware by implementing the handle() method:
namespace App\Middleware;class AuthMiddleware{ public function handle() { // Check if user is logged in if (!isset($_SESSION['user_id'])) { return false; // User not authenticated } return true; // User is authenticated }}
The router invokes middleware through the handleMiddleware() method:
Sphp/Core/Router.php
private function handleMiddleware($middleware){ if (class_exists($middleware)) { $middleware_object = new $middleware(); if (method_exists($middleware_object, 'handle')) { return $middleware_object->handle(); } else { return Response::response('500', 'Internal server Error, No Middleware Method exist'); } } else { return Response::response('500', 'Internal server Error, No Middleware Class exist'); }}
namespace App\Middleware;use Sphp\Services\Auth;class AuthMiddleware{ public function handle() { // Check if user is authenticated if (!Auth::check()) { // Redirect to login page header('Location: /login'); exit; } return true; }}
Create app/views/403.html for unauthorized access:
<!DOCTYPE html><html><head> <title>403 Forbidden</title></head><body> <h1>Access Denied</h1> <p>You do not have permission to access this resource.</p></body></html>
// Good: Separate middleware for different concernsclass AuthMiddleware { } // Handles authenticationclass AdminMiddleware { } // Handles admin authorizationclass CsrfMiddleware { } // Handles CSRF protection// Avoid: One middleware doing everythingclass SecurityMiddleware { } // Too broad
Early Returns
Return as early as possible to improve performance:
public function handle(){ // Check the quickest conditions first if (!isset($_SESSION['user_id'])) { return false; } if (!$this->hasPermission()) { return false; } return true;}
Meaningful Error Messages
Provide helpful feedback when middleware fails:
public function handle(){ if (!isset($_SESSION['user_id'])) { $_SESSION['error'] = 'Please log in to access this page'; header('Location: /login'); exit; } return true;}
Session Management
Ensure session is started before using middleware:
public/index.php
session_start();// Then load routes with middlewarerequire_once __DIR__ . '/../app/router/web.php';
Always ensure your middleware’s handle() method returns a boolean value or properly handles redirects. Returning null or forgetting a return statement can lead to unexpected behavior.
For multiple middleware on one route, create a composite middleware:
namespace App\Middleware;class CompositeMiddleware{ public function handle() { $authMiddleware = new AuthMiddleware(); if (!$authMiddleware->handle()) { return false; } $roleMiddleware = new AdminMiddleware(); if (!$roleMiddleware->handle()) { return false; } return true; }}