# Класс HttpSoft\Basis\Application
Этот класс управляет фундаментальными процессами HTTP-приложения, используя несколько независимых компонентов.
- Экземпляр HttpSoft\Router\RouteCollector — создает экземпляры HttpSoft\Router\Route из предоставляемых путей, HTTP-методов и обработчиков.
- Экземпляр HttpSoft\Emitter\EmitterInterface — излучает реализации Psr\Http\Message\ResponseInterface, смотрите HttpSoft\Emitter\SapiEmitter.
- Экземпляр HttpSoft\Runner\MiddlewarePipelineInterface — отвечает за построение конвейеров посредников PSR-15, смотрите HttpSoft\Runner\MiddlewarePipeline.
- Экземпляр HttpSoft\Runner\MiddlewareResolverInterface — резолвит обработчик запроса, преобразуя его в экземпляр Psr\Http\Server\MiddlewareInterface, смотрите HttpSoft\Runner\MiddlewareResolver.
- Экземпляр HttpSoft\Runner\ServerRequestRunner — отвечает за маршалинг входящего запроса Psr\Http\Message\ServerRequestInterface и отправляет клиенту экземпляр ответа Psr\Http\Message\ResponseInterface.
Для использования данного класса вы можете просто создать экземпляр, учитывая все необходимые для этого зависимости, но лучше использовать контейнер внедрения зависимостей, реализующий PSR-11. Использование контейнера позволяет получить доступ к созданным зависимостям и их данным в других местах приложения.
/**
* @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\Cookie\CookieSendMiddleware::class);
$app->pipe(HttpSoft\Router\Middleware\RouteDispatchMiddleware::class);
// Добавление маршрутов.
$app->get('home', '/', HomeHandler::class);
$app->get('list', '/list{[page]}', ListHandler::class)->tokens(['page' => '\d+']);
$app->get('view', '/view/{slug}', ViewHandler::class)->tokens(['slug' => '[\w-]+']);
$app->delete('delete', '/delete/{id}', DeleteHandler::class)->tokens(['id' => '\d+']);
$app->add('edit', '/(create|update)/{id}', EditHandler::class, ['GET', 'POST'])
->tokens(['id' => '\d+'])
;
// Запуск приложения.
$app->run(HttpSoft\ServerRequest\ServerRequestCreator::create());
# Публичные методы
public function __construct(
HttpSoft\Router\RouteCollector $router,
HttpSoft\Emitter\EmitterInterface $emitter,
HttpSoft\Runner\MiddlewarePipelineInterface $pipeline,
HttpSoft\Runner\MiddlewareResolverInterface $resolver,
Psr\Http\Server\RequestHandlerInterface $default = null
);
# run
Запускает реализацию Psr\Http\Message\ServerRequestInterface и отправляет клиенту экземпляр Psr\Http\Message\ResponseInterface.
public function run(
Psr\Http\Message\ServerRequestInterface $request,
Psr\Http\Server\RequestHandlerInterface $defaultHandler = null
): void;
Если $defaultHandler
был указан, то он будет использоваться в качестве обработчика по умолчанию, в противном случае будет использоваться $default
, переданный в конструктор.
Если обработчик по умолчанию был установлен, то будет вызван метод HttpSoft\Runner\MiddlewarePipelineInterface::process()
, в противном случае будет вызван метод HttpSoft\Runner\MiddlewarePipelineInterface::handle()
.
# pipe
Добавляет посредник в конвейер.
public function pipe($middleware, string $pathPrefix = null): void;
$middleware
— любое допустимое значение, которое может быть преобразовано в экземпляр Psr\Http\Server\MiddlewareInterface, смотрите HttpSoft\Runner\MiddlewareResolver.
При указании префикса пути посредник прикрепляется к определенному пути и будет обрабатываться только в том случае, если путь URI запроса начинается с данного префикса.
// Доступно: `https://example.com` и `https://example.com/any`:
$pipeline->pipe($commonMiddleware);
// или
$pipeline->pipe($commonMiddleware, '');
// или
$pipeline->pipe($commonMiddleware, '/');
// Доступно: `https://example.com/api` and `https://example.com/api/any`:
$pipeline->pipe($apiMiddleware, '/api');
// Доступно: `https://example.com/api/admin` и `https://example.com/api/admin/any`:
$pipeline->pipe($apiAdminMiddleware, '/api/admin');
// но не доступно: `https://example.com/api` and `https://example.com/api/any`.
Префикс пути ДОЛЖЕН начинаться с корня, а начальный и конечный слэш необязательны (/path
, path
или path/
).
// Один посредник может быть прикреплен к разным путям:
$pipeline->pipe($authMiddleware, 'blog');
$pipeline->pipe($authMiddleware, '/forum');
// К одному пути можно прикрепить несколько посредников:
$pipeline->pipe($authMiddleware, 'admin/');
$pipeline->pipe($adminMiddleware, '/admin/');
# group
Создает группу маршрутов с общим префиксом пути.
/**
* @param string $prefix общий префикс пути для группы маршрутов.
* @param callable $callback каллбэк, который добавит маршруты с общим префиксом пути.
*/
public function group(string $prefix, callable $callback): void;
Каллбэк может принимать экземпляр HttpSoft\Router\RouteCollector в качестве параметра.
$app->group('/post', static function (RouteCollector $router) use ($handler): void {
// '/post/post-slug'
$router->get('post.view', '/{slug}', $handler)->tokens(['slug' => '[\w-]+']);
// '/post' or '/post/2'
$router->get('post.list', '/list{[page]}', $handler)->tokens(['page' => '\d+']);
// '/post/delete/13'
$router->delete('post.delete', '/delete/{id}', DeleteHandler::class)->tokens(['id' => '\d+']);
// '/post/create/11' or '/post/update/12'
$router->add('post.edit', '/(create|update)/{id}', EditHandler::class, ['GET', 'POST'])
->tokens(['id' => '\d+'])
;
});
# add
Добавляет маршрут и возвращает его.
/**
* @param string $name уникальное название маршрута.
* @param string $pattern шаблон пути с параметрами.
* @param mixed $handler action, controller, callable, closure и т.д.
* @param array $methods разрешенные методы запроса для маршрута.
* @return HttpSoft\Router\Route
*/
public function add(string $name, string $pattern, $handler, array $methods): Route;
# any
Добавляет общий маршрут для любых методов запроса и возвращает его.
/**
* @param string $name уникальное название маршрута.
* @param string $pattern шаблон пути с параметрами.
* @param mixed $handler action, controller, callable, closure и т.д.
* @return HttpSoft\Router\Route
*/
public function any(string $name, string $pattern, $handler): Route;
# get
Добавляет маршрут только для метода GET
и возвращает его.
/**
* @param string $name уникальное название маршрута.
* @param string $pattern шаблон пути с параметрами.
* @param mixed $handler action, controller, callable, closure и т.д.
* @return HttpSoft\Router\Route
*/
public function get(string $name, string $pattern, $handler): Route;
# post
Добавляет маршрут только для метода POST
и возвращает его.
/**
* @param string $name уникальное название маршрута.
* @param string $pattern шаблон пути с параметрами.
* @param mixed $handler action, controller, callable, closure и т.д.
* @return HttpSoft\Router\Route
*/
public function post(string $name, string $pattern, $handler): Route;
# put
Добавляет маршрут только для метода PUT
и возвращает его.
/**
* @param string $name уникальное название маршрута.
* @param string $pattern шаблон пути с параметрами.
* @param mixed $handler action, controller, callable, closure и т.д.
* @return HttpSoft\Router\Route
*/
public function put(string $name, string $pattern, $handler): Route;
# patch
Добавляет маршрут только для метода PATCH
и возвращает его.
/**
* @param string $name уникальное название маршрута.
* @param string $pattern шаблон пути с параметрами.
* @param mixed $handler action, controller, callable, closure и т.д.
* @return HttpSoft\Router\Route
*/
public function patch(string $name, string $pattern, $handler): Route;
# delete
Добавляет маршрут только для метода DELETE
и возвращает его.
/**
* @param string $name уникальное название маршрута.
* @param string $pattern шаблон пути с параметрами.
* @param mixed $handler action, controller, callable, closure и т.д.
* @return HttpSoft\Router\Route
*/
public function delete(string $name, string $pattern, $handler): Route;
# head
Добавляет маршрут только для метода HEAD
и возвращает его.
/**
* @param string $name уникальное название маршрута.
* @param string $pattern шаблон пути с параметрами.
* @param mixed $handler action, controller, callable, closure и т.д.
* @return HttpSoft\Router\Route
*/
public function head(string $name, string $pattern, $handler): Route;
# options
Добавляет маршрут только для метода OPTIONS
и возвращает его.
/**
* @param string $name уникальное название маршрута.
* @param string $pattern шаблон пути с параметрами.
* @param mixed $handler action, controller, callable, closure и т.д.
* @return HttpSoft\Router\Route
*/
public function options(string $name, string $pattern, $handler): Route;