diff options
author | msquare <msquare@notrademark.de> | 2018-09-07 20:50:31 +0200 |
---|---|---|
committer | msquare <msquare@notrademark.de> | 2018-09-07 20:50:31 +0200 |
commit | 2d6bca1357faff28bc1f86a56b432cc463ff7574 (patch) | |
tree | ce18461d2e170ac28dd365342a1f125a8a31aa3a /src/Middleware/CallableHandler.php | |
parent | b320fc779063ee80b8f0ba505cb323287ccccbf5 (diff) | |
parent | ce6d0fd13b54ac79a955b85d50860736a520d333 (diff) |
Merge branch 'MyIgel-routing'
Diffstat (limited to 'src/Middleware/CallableHandler.php')
-rw-r--r-- | src/Middleware/CallableHandler.php | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/Middleware/CallableHandler.php b/src/Middleware/CallableHandler.php new file mode 100644 index 00000000..eb493bf1 --- /dev/null +++ b/src/Middleware/CallableHandler.php @@ -0,0 +1,77 @@ +<?php + +namespace Engelsystem\Middleware; + +use Engelsystem\Container\Container; +use Engelsystem\Http\Response; +use InvalidArgumentException; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Server\MiddlewareInterface; +use Psr\Http\Server\RequestHandlerInterface; + +class CallableHandler implements MiddlewareInterface, RequestHandlerInterface +{ + /** @var callable */ + protected $callable; + + /** @var Container */ + protected $container; + + /** + * @param callable $callable The callable that should be wrapped + * @param Container $container + */ + public function __construct(callable $callable, Container $container = null) + { + $this->callable = $callable; + $this->container = $container; + } + + /** + * Process an incoming server request and return a response, optionally delegating + * response creation to a handler. + * + * @param ServerRequestInterface $request + * @param RequestHandlerInterface $handler + * @return ResponseInterface + */ + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface + { + return $this->execute([$request, $handler]); + } + + /** + * Handle the request and return a response. + * + * @param ServerRequestInterface $request + * @return ResponseInterface + */ + public function handle(ServerRequestInterface $request): ResponseInterface + { + return $this->execute([$request]); + } + + /** + * Execute the callable and return a response + * + * @param array $arguments + * @return ResponseInterface + */ + protected function execute(array $arguments = []): ResponseInterface + { + $return = call_user_func_array($this->callable, $arguments); + + if ($return instanceof ResponseInterface) { + return $return; + } + + if (!$this->container instanceof Container) { + throw new InvalidArgumentException('Unable to resolve response'); + } + + /** @var Response $response */ + $response = $this->container->get('response'); + return $response->withContent($return); + } +} |