# Реализация PSR-7 и PSR-15
Данный шаблон приложения использует пакет httpsoft/http-message, который является легковесной, быстрой, высокопроизводительной и строгой реализацией PSR-7 и PSR-17.
Пакет
HttpSoft\Message
не содержит никакой дополнительной функциональности кроме определенной в PSR-интерфейсах.
Используется еще два пакета, которые предоставляют дополнительный функционал:
- httpsoft/http-response — коллекция классов, реализующих интерфейс Psr\Http\Message\ResponseInterface.
- httpsoft/http-server-request — инфраструктура для создания экземпляров Psr\Http\Message\ServerRequestInterface и Psr\Http\Message\UploadedFileInterface.
Дополнительная информация:
- Описание интерфейсов PSR-7.
- Описание интерфейсов PSR-17.
- Описание классов пакета HttpSoft\Message.
- Описание классов пакета HttpSoft\Response.
- Описание классов пакета HttpSoft\ServerRequest.
# Конвейер посредников
Для данного шаблона приложения и микрофреймворка HttpSoft\Basis использование конвейера посредников является основополагающей парадигмой. Конвейер посредников работает следующим образом.
- Посредники добавляются в конвейер config/pipeline.php.
- Приложение запускает обработку текущего HTTP-запроса, реализующего Psr\Http\Message\ServerRequestInterface.
- С помощью пакета httpsoft/http-runner, объект HTTP-запроса обрабатывается ранее установленными посредниками по очереди, т.е. способом FIFO («первым пришёл — первым ушёл»).
- В зависимости от результата обработки запроса возвращается 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` не выполняется.
Подробнее о маршрутизации читайте здесь.