# Класс HttpSoft\Runner\MiddlewareResolver
Класс, который реализует HttpSoft\Runner\MiddlewareResolverInterface и резолвит обработчик запроса, преобразуя его в экземпляр Psr\Http\Server\MiddlewareInterface.
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;
Обработчик должен быть одним из:
- Строка (имя класса или идентификатор определения контейнера) или экземпляр, реализующий Psr\Http\Server\MiddlewareInterface или Psr\Http\Server\RequestHandlerInterface.
/**
* @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);
- Любой вариант типа
callable
без аргументов, возвращающий экземпляр Psr\Http\Message\ResponseInterface.
$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);
});
- Любой вариант типа
callable
, соответствующий сигнатуре Psr\Http\Server\MiddlewareInterface::process().
$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.