Chapter 11 of 15
Middleware.
PSR-15 middleware handles shared HTTP concerns around controller execution.
A small PSR-15 layer
Middleware implements MiddlewareInterface. It either delegates through $handler->handle($request) or returns its own response to stop the pipeline.
RequireHeaderMiddleware.php
<?php
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
final class RequireHeaderMiddleware implements MiddlewareInterface
{
public function process(
ServerRequestInterface $request,
RequestHandlerInterface $handler,
): ResponseInterface {
return $handler->handle($request);
}
}Constructor dependencies come from the container. Keep business logic in application services.
Attaching middleware
Add route middleware with ->middleware(ClassName::class). The same concern can be attached to an entire route group.
Route middleware
<?php
$router
->getNamed(
'account',
'/account',
ControllerAction::for(AccountController::class, 'show'),
)
->middleware(RequireHeaderMiddleware::class);Registration order controls how the handler is wrapped. Global middleware additionally runs before routing.