Reference
The Request Handler Runner
Laminas\HttpHandlerRunner\RequestHandlerRunner
can be used to run a
PSR-15 RequestHandlerInterface
instance.
By this, we mean:
- Marshal a server request instance.
- Handle exceptions due to marshaling the server request instance.
- Pass the request to the composed request handler.
- Pass the response generated by the request handler to the composed emitter
The runner takes four constructor arguments, in the following order:
- A
Psr\Http\Server\RequestHandlerInterface
instance. - A
Laminas\HttpHandlerRunner\Emitter\EmitterInterface
instance. - A PHP callable to generate a
Psr\Http\Message\ServerRequestInterface
instance. - A PHP callable that can generate a
Psr\Http\Message\ResponseInterface
instance given a PHPThrowable
generated by the server request factory from the third argument.
Once constructed, you may call the method run()
:
$runner->run();
Server request factory
The $serverRequestFactory
argument to the constructor may be any PHP callable
that accepts no arguments (or all optional arguments), and which returns a
PSR-7 ServerRequestInterface
instance.
As an example, using laminas-diactoros:
use Laminas\Diactoros\ServerRequestFactory;
$serverRequestFactory = [ServerRequestFactory::class, 'fromGlobals'];
Alternately, a PSR-17 (proposed specification for HTTP message factories) factory may be used:
use HttpInterop\Implementation\ServerRequestFactory;
$serverRequestFactory = function () use ($_SERVER, $factory) {
return $factory->createServerRequestFromArray($_SERVER);
};
Server request error response generator
In rare cases, the server request factory may raise a PHP Throwable
or
Exception
. In those cases, the runner still needs to generate a response to
emit.
The server request error response generator argument to the
RequestHandlerRunner
constructor may be any PHP callable that accepts a PHP
Throwable
argument, and which returns a PSR-7 ResponseInterface
instance.
As an example, laminas-stratigility
provides the class Laminas\Stratigility\Middleware\ErrorResponseGenerator
, which
is typically used with its ErrorHandler
to generate a response. It can be
re-purposed if we curry in empty server request and response instances as
follows:
use Throwable;
use Laminas\Diactoros\Response;
use Laminas\Diactoros\ServerRequest;
use Laminas\Stratigility\Middleware\ErrorResponseGenerator;
$errorResponseGenerator = function (Throwable $e) {
$generator = new ErrorResponseGenerator();
return $generator($e, new ServerRequest(), new Response());
};
Request handlers
Request handlers MUST implement Psr\Http\Server\RequestHandlerInterface
.
Additionally, for best results, they MUST provide their own error and exception
handling, to ensure that a response is returned and the runner is able to emit a
response.