Completed
Pull Request — master (#115)
by Phil
02:51
created

JsonStrategy::getExecutionChain()   B

Complexity

Conditions 5
Paths 2

Size

Total Lines 40
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 40
ccs 0
cts 32
cp 0
rs 8.439
cc 5
eloc 24
nc 2
nop 2
crap 30
1
<?php
2
3
namespace League\Route\Strategy;
4
5
use Exception;
6
use League\Route\Http\Exception as HttpException;
7
use League\Route\Middleware\ExecutionChain;
8
use League\Route\Route;
9
use Psr\Http\Message\ResponseInterface;
10
use Psr\Http\Message\ServerRequestInterface;
11
use RuntimeException;
12
13
class JsonStrategy implements StrategyInterface
14
{
15
    /**
16
     * {@inheritdoc}
17
     */
18
    public function getExecutionChain(Route $route, array $vars)
19
    {
20
        $middleware = function (
21
            ServerRequestInterface $request, ResponseInterface $response, callable $next
22
        ) use (
23
            $route, $vars
24
        ) {
25
            try {
26
                $response = call_user_func_array($route->getCallable(), [$request, $response, $vars]);
27
28
                if (! $response instanceof ResponseInterface) {
29
                    throw new RuntimeException(
30
                        'Route callables must return an instance of (Psr\Http\Message\ResponseInterface)'
31
                    );
32
                }
33
34
                $response = $next($request, $response);
35
            } catch (HttpException $e) {
36
                $response = $e->buildJsonResponse($response);
37
            } catch (Exception $e) {
38
                $body = [
39
                    'code'    => 500,
40
                    'message' => $e->getMessage()
41
                ];
42
43
                $response->getBody()->write(json_encode($body));
44
                $response = $response->withStatus(500);
45
            }
46
47
            return $response->withAddedHeader('content-type', 'application/json');
48
        };
49
50
        $execChain = (new ExecutionChain)->middleware($middleware);
51
52
        foreach ($route->getMiddlewareStack() as $middleware) {
53
            $execChain->middleware($middleware);
54
        }
55
56
        return $execChain;
57
    }
58
}
59