Назад к вопросам

Ответ от нейросети

sobes.tech AI

Промежуточное программное обеспечение (middleware) — это слой ПО или фреймворка, который обрабатывает входящие HTTP-запросы до того, как они попадут в конечный обработчик (например, контроллер), и исходящие HTTP-ответы после обработки. Оно выполняет различные действия: аутентификация, авторизация, логирование, модификация запроса/ответа и т.д. Middlewares обычно формируют конвейер (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());

Middlewares позволяют декомпозировать логику обработки запросов, делая код более модульным, переиспользуемым и легко тестируемым. Они следуют принципу "единой ответственности".