This package provides a Psr-15 request handler proxying a Psr-11 container entry.
Require php >= 7.0
Installation composer require ellipse/handlers-container
Run tests ./vendor/bin/kahlan
The class Ellipse\Handlers\ContainerRequestHandler
takes an implementation of Psr\Container\ContainerInterface
and a container id as parameters. Its ->handle()
method retrieve a request handler from the container using this id and proxy its ->handle()
method.
It can be useful in situations the container entry should be resolved at the time the request is handled.
An Ellipse\Handlers\Exceptions\ContainedRequestHandlerTypeException
is thrown when the value retrieved from the container is not an object implementing Psr\Http\Server\RequestHandlerInterface
.
<?php
namespace App;
use SomePsr11Container;
use Ellipse\Handlers\ContainerRequestHandler;
// Get some Psr-11 container.
$container = new SomePsr11Container;
// Add a request handler in the container.
$container->set('some.request.handler', function () {
return new SomeRequestHandler;
});
// Create a container request handler with the Psr-11 container and the entry id.
$handler = new ContainerRequestHandler($container, 'some.request.handler');
// The handler ->handle() method retrieve the request handler from the container and proxy it.
$response = $handler->handle($request);
It can be cumbersome to register every request handler classes in the container. Here is how to auto wire request handler instances using the Ellipse\Container\ReflectionContainer
class from the ellipse/container-reflection package.
<?php
namespace App;
use Psr\Http\Server\RequestHandlerInterface;
use SomePsr11Container;
use Ellipse\Container\ReflectionContainer;
use Ellipse\Handlers\ContainerRequestHandler;
// Get some Psr-11 container.
$container = new SomePsr11Container;
// Decorate the container with a reflection container.
// Specify the request handler implementations can be auto wired.
$reflection = new ReflectionContainer($container, [
RequestHandlerInterface::class,
]);
// Create a container request handler with the reflection container and a request handler class name.
$handler = new ContainerRequestHandler($reflection, SomeRequestHandler::class);
// An instance of SomeRequestHandler is built and its ->handle() method is proxied.
$response = $handler->handle($request);