Sobes.tech
Middle

Какво е middleware?

sobes.tech AI

Отговор от AI

Междинният софтуер (middleware) е слой софтуер или рамка, който обработва входящите HTTP заявки преди да достигнат до крайния обработчик (например, контролер), и изходящите HTTP отговори след обработката. Той изпълнява различни действия: удостоверяване, авторизация, логиране, модифициране на заявката/отговора и т.н. Middleware-ите обикновено формират конвейер (pipeline), където всеки middleware изпълнява своята функция и предава заявката на следващия или на крайния обработчик.

Пример в PHP (с използване на 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
    {
        // Проверка на удостоверяването на потребителя
        if (!$this->isAuthenticated($request)) {
            // Ако потребителят не е удостоверен, връщаме грешка
            return new \Slim\Psr7\Response(401); // Пример за създаване на PSR-7 отговор
        }

        // Ако потребителят е удостоверен, предаваме заявката на следващия обработчик
        return $handler->handle($request);
    }

    private function isAuthenticated(ServerRequestInterface $request): bool
    {
        // Логика за проверка на удостоверяване (например по заглавка, сесия и т.н.)
        return true; // Заглушка
    }
}

class LoggingMiddleware implements MiddlewareInterface
{
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        // Логиране на информация за заявката преди обработката й
        $method = $request->getMethod();
        $uri = (string) $request->getUri();
        error_log("Handling request: $method $uri");

        // Предаване на заявката на следващия обработчик и получаване на отговор
        $response = $handler->handle($request);

        // Логиране на информация за отговора след обработката
        $statusCode = $response->getStatusCode();
        error_log("Response status: $statusCode");

        // Връщане на отговора
        return $response;
    }
}

// Пример за използване в рутер (опростено)
// $router->addMiddleware(new AuthenticationMiddleware());
// $router->addMiddleware(new LoggingMiddleware());
// $router->addRoute('GET', '/profile', new ProfileHandler());

Middleware-ите позволяват да се декомпозира логиката за обработка на заявките, правейки кода по-модулен, повторно използваем и лесен за тестване. Те следват принципа "единствена отговорност".