LEMONADE Documentation

Documentation.

Fifteen chapters covering installation, project structure, application development, CLI and production deployment.

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.

Detailed technical documentation on GitHub