# Реализация PSR-7 и PSR-15

Данный шаблон приложения использует пакет httpsoft/http-message, который является легковесной, быстрой, высокопроизводительной и строгой реализацией PSR-7 и PSR-17.

Пакет HttpSoft\Message не содержит никакой дополнительной функциональности кроме определенной в PSR-интерфейсах.

Используется еще два пакета, которые предоставляют дополнительный функционал:

Дополнительная информация:

# Конвейер посредников

Для данного шаблона приложения и микрофреймворка HttpSoft\Basis использование конвейера посредников является основополагающей парадигмой. Конвейер посредников работает следующим образом.

  1. Посредники добавляются в конвейер config/pipeline.php.
  2. Приложение запускает обработку текущего HTTP-запроса, реализующего Psr\Http\Message\ServerRequestInterface.
  3. С помощью пакета httpsoft/http-runner, объект HTTP-запроса обрабатывается ранее установленными посредниками по очереди, т.е. способом FIFO («первым пришёл — первым ушёл»).
  4. В зависимости от результата обработки запроса возвращается HTTP-ответ, реализующий Psr\Http\Message\ResponseInterface.

Посредник — любое допустимое значение, которое может быть преобразовано в экземпляр Psr\Http\Server\MiddlewareInterface, смотрите HttpSoft\Runner\MiddlewareResolver.

Посредники, работа которых влияет на другие посредники, например HttpSoft\ErrorHandler\ErrorHandlerMiddleware, должны добавляться первыми в конвейер.

Дополнительная информация:

# Пример использования

Создание объекта приложения и настройка конвейера посредников.

/**
 * @var Psr\Container\ContainerInterface $container
 * @var Psr\Http\Server\MiddlewareInterface $adminMiddleware
 */

$app = $container->get(HttpSoft\Basis\Application::class);

$app->pipe(HttpSoft\ErrorHandler\ErrorHandlerMiddleware::class);
$app->pipe(HttpSoft\Basis\Middleware\BodyParamsMiddleware::class);
$app->pipe(HttpSoft\Basis\Middleware\ContentLengthMiddleware::class);
$app->pipe(HttpSoft\Router\Middleware\RouteMatchMiddleware::class);
$app->pipe($adminMiddleware, '/admin');
// Любые пользовательские посредники.
$app->pipe(HttpSoft\Router\Middleware\RouteDispatchMiddleware::class);

Добавление маршрутов.

use HttpSoft\Response\TextResponse;

$app->get('home', '/', fn => new TextResponse('Home'));
$app->get('about', '/about', fn => new TextResponse('About'));
$app->get('admin', '/admin', fn => new TextResponse('Admin'));
$app->get('admin.tasks', '/admin/tasks', fn => new TextResponse('Admin Tasks'));

Запуск приложения.

use HttpSoft\Message\Uri;

$request = HttpSoft\ServerRequest\ServerRequestCreator::create();

// Результат вывода: 'Home'
$app->run($request->withUri(new Uri('/')));
// `$adminMiddleware` не выполняется.

// Результат вывода: 'About'
$app->run($request->withUri(new Uri('/about')));
// `$adminMiddleware` не выполняется.

// Результат вывода: 'Admin'
$app->run($request->withUri(new Uri('/admin')));
// `$adminMiddleware` выполняется.

// Результат вывода: 'Admin Tasks'
$app->run($request->withUri(new Uri('/admin/tasks')));
// `$adminMiddleware` выполняется.

// Результат вывода: '404 Not Found'
$app->run($request->withUri(new Uri('/blog')));
// `$adminMiddleware` не выполняется.

Подробнее о маршрутизации читайте здесь.