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.

app/Http/Middleware/AppHeaderMiddleware.php
<?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á.

app/Config/Routing.php
<?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.

app/Http/Middleware/RequireRequestId.php
<?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);
    }
}
Související dokumentaceVíce informací najdete v kapitole Middleware v dokumentaci.

← Všechny ukázky