# Класс HttpSoft\Basis\Application

Этот класс управляет фундаментальными процессами HTTP-приложения, используя несколько независимых компонентов.

Для использования данного класса вы можете просто создать экземпляр, учитывая все необходимые для этого зависимости, но лучше использовать контейнер внедрения зависимостей, реализующий PSR-11. Использование контейнера позволяет получить доступ к созданным зависимостям и их данным в других местах приложения.

Исходный код на GitHub.

/**
 * @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 и возвращает его.

/**
 * @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;