Sobes.tech
Middle

Co je middleware?

sobes.tech AI

Odpověď od AI

Middleware (prostřední software) je vrstva softwaru nebo rámec, který zpracovává příchozí HTTP požadavky před tím, než dorazí k finálnímu zpracovateli (například kontroléru), a odchozí HTTP odpovědi po zpracování. Provádí různé akce: autentizaci, autorizaci, logování, modifikaci požadavku/odpovědi atd. Middleware obvykle tvoří pipeline, kde každý middleware plní svou funkci a předává požadavek dalšímu nebo finálnímu zpracovateli.

Příklad v PHP (s použitím PSR-7/PSR-15):

<?php

use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

class AuthenticationMiddleware implements MiddlewareInterface
{
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        // Kontrola autentizace uživatele
        if (!$this->isAuthenticated($request)) {
            // Pokud není autentizován, vrátí chybu
            return new \Slim\Psr7\Response(401); // Příklad vytvoření PSR-7 odpovědi
        }

        // Pokud je autentizován, předá požadavek dalšímu zpracovateli
        return $handler->handle($request);
    }

    private function isAuthenticated(ServerRequestInterface $request): bool
    {
        // Logika kontroly autentizace (například hlavičky, session apod.)
        return true; // Zástupný
    }
}

class LoggingMiddleware implements MiddlewareInterface
{
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        // Logování informací o požadavku před jeho zpracováním
        $method = $request->getMethod();
        $uri = (string) $request->getUri();
        error_log("Handling request: $method $uri");

        // Předání požadavku dalšímu zpracovateli a získání odpovědi
        $response = $handler->handle($request);

        // Logování informací o odpovědi po zpracování
        $statusCode = $response->getStatusCode();
        error_log("Response status: $statusCode");

        // Vrácení odpovědi
        return $response;
    }
}

// Příklad použití v routeru (zjednodušené)
// $router->addMiddleware(new AuthenticationMiddleware());
// $router->addMiddleware(new LoggingMiddleware());
// $router->addRoute('GET', '/profile', new ProfileHandler());

Middleware umožňuje rozdělit logiku zpracování požadavků, čímž je kód modulárnější, znovu použitelnější a snadněji testovatelný. Dodržují princip "jediné odpovědnosti".