# Класс HttpSoft\Runner\MiddlewareResolver

Класс, который реализует HttpSoft\Runner\MiddlewareResolverInterface и резолвит обработчик запроса, преобразуя его в экземпляр Psr\Http\Server\MiddlewareInterface.

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

use HttpSoft\Message\Response;
use HttpSoft\Runner\MiddlewareResolver;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;

/**
 * @var Psr\Http\Server\RequestHandlerInterface $handler
 * @var Psr\Http\Server\MiddlewareInterface $middleware
 */

/** @var Psr\Container\ContainerInterface|null $container */
$resolver = new MiddlewareResolver($container);

$middleware = $resolver->resolve($handler);
$middleware = $resolver->resolve($middleware);
// или
$middleware = $resolver->resolve(ClassImplementsMiddlewareInterface::class);
$middleware = $resolver->resolve(ClassImplementsRequestHandlerInterface::class);

// Из вызываемого обработчика

$middleware = $resolver->resolve([new HandlerClass(), 'methodName']);
$middleware = $resolver->resolve([HandlerClass::class, 'staticMethodName']);
// или
$middleware = $resolver->resolve(fn(): ResponseInterface => new Response());
// или с аргументами 
$callable = function (ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface {
    // Какие-то действия с запросом
    $response = $handler->handle($request);
    // Какие-то действия с ответом
    return $response;
};
$middleware = $resolver->resolve($callable);

// Из массива обработчиков
$middleware = $resolver->resolve([$middleware, $callable, $handler]);

# Публичные методы

Оригинальное подробное описание методов смотрите в HttpSoft\Runner\MiddlewareResolverInterface.

public function __construct(ContainerInterface $container = null);

Если указан экземпляр Psr\Container\ContainerInterface, то при резолве имени класса (строки) будет использоваться $container->get($className);, в противном случае объект будет создан с использованием new.

Реализация Psr\Container\ContainerInterface должна использовать автовайринг.

# resolve

Резолвит обработчик запроса, преобразуя его в экземпляр Psr\Http\Server\MiddlewareInterface.

/**
 * @param mixed $handler
 * @return Psr\Http\Server\MiddlewareInterface
 * @throws HttpSoft\Runner\Exception\InvalidMiddlewareResolverHandlerException
 */
public function resolve($handler): MiddlewareInterface;

Обработчик должен быть одним из:

/**
 * @var HttpSoft\Runner\MiddlewareResolver $resolver
 * @var Psr\Http\Server\RequestHandlerInterface $handler
 * @var Psr\Http\Server\MiddlewareInterface $middleware
 */

$middleware = $resolver->resolve($handler);
$middleware = $resolver->resolve($middleware);
// или
$middleware = $resolver->resolve(ClassImplementsMiddlewareInterface::class);
$middleware = $resolver->resolve(ClassImplementsRequestHandlerInterface::class);
$middleware = $resolver->resolve([new HandlerClass(), 'methodName']);
$middleware = $resolver->resolve([HandlerClass::class, 'staticMethodName']);
// или
$middleware = $resolver->resolve(fn(): ResponseInterface => new Response());
$middleware = $resolver->resolve(function (): ResponseInterface {
    // Какие-то действия
    return new Response(404);
});
$middleware = $resolver->resolve([new MiddlewareClass(), 'process']);
$middleware = $resolver->resolve([MiddlewareClass::class, 'staticProcess']);
// или
$callable = function (ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface {
    // Какие-то действия с запросом
    $response = $handler->handle($request);
    // Какие-то действия с ответом
    return $response;
};
$middleware = $resolver->resolve($callable);
  • Массив ранее перечисленных обработчиков.
$middleware = $resolver->resolve([
    new ClassImplementsMiddlewareInterface(),
    [new MiddlewareClass(), 'process'],
    ClassImplementsRequestHandlerInterface::class,
]);

Если обработчик невалидный, будет брошено исключение HttpSoft\Runner\Exception\InvalidMiddlewareResolverHandlerException.