Middleware Package
PSR-15 middleware pipeline.
Installation
bash
composer require lighthouse/middlewareBasic Usage
php
use Lighthouse\Middleware\Pipeline;
$pipeline = new Pipeline();
$pipeline->pipe(new AuthMiddleware());
$pipeline->pipe(new LoggingMiddleware());
$response = $pipeline->handle($request);Creating Middleware
Implement MiddlewareInterface:
php
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
class LoggingMiddleware implements MiddlewareInterface
{
public function process(
ServerRequestInterface $request,
RequestHandlerInterface $handler
): ResponseInterface {
// Before
$start = microtime(true);
// Call next
$response = $handler->handle($request);
// After
$duration = microtime(true) - $start;
error_log("Request took {$duration}s");
return $response;
}
}Callable Middleware
php
$pipeline->pipe(function ($request, $handler) {
$response = $handler->handle($request);
return $response->withHeader('X-Powered-By', 'Lighthouse');
});Fallback Handler
Set the final handler:
php
$pipeline->fallback(new class implements RequestHandlerInterface {
public function handle(ServerRequestInterface $request): ResponseInterface
{
return new Response(404);
}
});Short-Circuiting
Return early without calling the next handler:
php
class AuthMiddleware implements MiddlewareInterface
{
public function process($request, $handler): ResponseInterface
{
if (!$this->isAuthenticated($request)) {
return new Response(401); // Stop here
}
return $handler->handle($request); // Continue
}
}Modifying Request
Pass data downstream via attributes:
php
public function process($request, $handler): ResponseInterface
{
$user = $this->getUser($request);
$request = $request->withAttribute('user', $user);
return $handler->handle($request);
}Access later:
php
$user = $request->getAttribute('user');PSR-15 Compliance
Pipeline→RequestHandlerInterface- Middleware →
MiddlewareInterface