Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
5 / 5
CRAP
100.00% covered (success)
100.00%
1 / 1
CallableHandler
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
5 / 5
7
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 process
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 handle
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 execute
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
3
 getCallable
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3declare(strict_types=1);
4
5namespace Engelsystem\Middleware;
6
7use Engelsystem\Container\Container;
8use Engelsystem\Http\Response;
9use InvalidArgumentException;
10use Psr\Http\Message\ResponseInterface;
11use Psr\Http\Message\ServerRequestInterface;
12use Psr\Http\Server\MiddlewareInterface;
13use Psr\Http\Server\RequestHandlerInterface;
14
15/**
16 * Wraps a callable to be used to respond / as a middleware
17 */
18class CallableHandler implements MiddlewareInterface, RequestHandlerInterface
19{
20    /** @var callable */
21    protected $callable;
22
23    /**
24     * @param callable  $callable The callable that should be wrapped
25     */
26    public function __construct(callable $callable, protected ?Container $container = null)
27    {
28        $this->callable = $callable;
29    }
30
31    /**
32     * Process an incoming server request and return a response, optionally delegating
33     * response creation to a handler.
34     */
35    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
36    {
37        return $this->execute([$request, $handler]);
38    }
39
40    /**
41     * Handle the request and return a response.
42     */
43    public function handle(ServerRequestInterface $request): ResponseInterface
44    {
45        return $this->execute([$request]);
46    }
47
48    /**
49     * Execute the callable and return a response
50     */
51    protected function execute(array $arguments = []): ResponseInterface
52    {
53        $return = call_user_func_array($this->callable, $arguments);
54
55        if ($return instanceof ResponseInterface) {
56            return $return;
57        }
58
59        if (!$this->container instanceof Container) {
60            throw new InvalidArgumentException('Unable to resolve response');
61        }
62
63        /** @var Response $response */
64        $response = $this->container->get('response');
65        return $response->withContent($return);
66    }
67
68    public function getCallable(): callable
69    {
70        return $this->callable;
71    }
72}