Error::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 3
ccs 0
cts 3
cp 0
rs 10
c 0
b 0
f 0
cc 1
eloc 1
nc 1
nop 1
crap 2
1
<?php
2
namespace Phrest\Middleware;
3
4
class Error implements \Interop\Http\ServerMiddleware\MiddlewareInterface
5
{
6
    /**
7
     * @var \Psr\Log\LoggerInterface
8
     */
9
    private $logger;
10
11
    public function __construct(\Psr\Log\LoggerInterface $logger)
12
    {
13
        $this->logger = $logger;
14
    }
15
16
    public function process(\Psr\Http\Message\ServerRequestInterface $request, \Interop\Http\ServerMiddleware\DelegateInterface $delegate)
17
    {
18
        set_error_handler(function ($errno, $errstr, $errfile, $errline) {
19
            if (! (error_reporting() & $errno)) {
20
                return;
21
            }
22
            throw new \ErrorException($errstr, 0, $errno, $errfile, $errline);
23
        });
24
25
        try {
26
            $response = $delegate->process($request);
27
            if (! $response instanceof \Psr\Http\Message\ResponseInterface) {
28
                throw new \Phrest\Exception('Application did not return a response');
29
            }
30
        } catch (\Throwable $e) {
31
            $response = new \Zend\Diactoros\Response\JsonResponse(
32
                [
33
                    'code' => \Phrest\API\ErrorCodes::INTERNAL_SERVER_ERROR,
34
                    'message' => 'internal server error',
35
                    'http' => [
36
                        'code' => \Phrest\Http\StatusCodes::INTERNAL_SERVER_ERROR,
37
                        'message' => \Phrest\Http\StatusCodes::message(\Phrest\Http\StatusCodes::INTERNAL_SERVER_ERROR),
38
                    ],
39
                ],
40
                \Phrest\Http\StatusCodes::INTERNAL_SERVER_ERROR
41
            );
42
43
            $this->logger->error($e->getMessage(), [
44
                'exception' => get_class($e),
45
                'file' => $e->getFile(),
46
                'line' => $e->getLine(),
47
                'trace' => explode("\n", $e->getTraceAsString())
48
            ]);
49
        }
50
51
        restore_error_handler();
52
53
        return $response;
54
    }
55
}