Middleware
Middleware obaluje požadavek a následující handler. Standard PSR-15 umožňuje požadavek ukončit vlastní odpovědí nebo upravit odpověď dalšího handleru.
PSR-15 middleware
AppHeaderMiddleware implementuje PSR-15 process(). Předá request dalšímu handleru přes handle() a k jeho PSR-7 odpovědi přidá X-App. withHeader() vrací upravenou kopii odpovědi, kterou middleware předá zpět runtime.
<?php
declare(strict_types=1);
namespace App\Http\Middleware;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
final class AppHeaderMiddleware implements MiddlewareInterface
{
public function process(
ServerRequestInterface $request,
RequestHandlerInterface $handler,
): ResponseInterface {
return $handler->handle($request)->withHeader('X-App', 'example');
}
}Přiřazení k routě
Routing.php připojuje AppHeaderMiddleware pouze k routě account. Container jej vytvoří po nalezení routy; middleware obalí AccountController::show() a hlavičku přidá při návratu odpovědi. Ostatních rout se toto pravidlo netýká.
<?php
declare(strict_types=1);
use App\Controllers\AccountController;
use App\Http\Middleware\AppHeaderMiddleware;
use Lemonade\Framework\Routing\ControllerAction;
$router
->getNamed(
'account',
'/account',
ControllerAction::for(AccountController::class, 'show'),
)
->middleware(AppHeaderMiddleware::class);Předčasné ukončení
RequireRequestId čte X-Request-Id z PSR požadavku. Bez hlavičky vrátí vlastní JSON odpověď 400 a handler už nevolá; s hlavičkou řízení předá dál. Samotná přítomnost hlavičky není autentizace.
<?php
declare(strict_types=1);
namespace App\Http\Middleware;
use Lemonade\Framework\Http\Response\Responses;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
final readonly class RequireRequestId implements MiddlewareInterface
{
public function __construct(private Responses $responses) {}
public function process(
ServerRequestInterface $request,
RequestHandlerInterface $handler,
): ResponseInterface {
if ($request->getHeaderLine('X-Request-Id') === '') {
return $this->responses->json(['error' => 'Missing request ID'], 400);
}
return $handler->handle($request);
}
}