Completed
Push — master ( 5b9cc9...264dc5 )
by Jeroen
02:23
created

Handler::handleShutdown()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 0
cts 8
cp 0
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 5
nc 2
nop 0
crap 6
1
<?php
2
3
namespace Protoku\Exceptions;
4
5
use ErrorException;
6
use Protoku\Interfaces\FormatterInterface;
7
8
class Handler
9
{
10
	const ERROR_HANDLER = 'handleError';
11
	const EXCEPTION_HANDLER = 'handleException';
12
	const SHUTDOWN_HANDLER = 'handleShutdown';
13
14
	/**
15
	 * @var FormatterInterface
16
	 */
17
	private $formatter;
18
19
	/**
20
	 * Handler constructor.
21
	 *
22
	 * @param FormatterInterface $formatter
23
	 */
24
	public function __construct(FormatterInterface $formatter)
25
	{
26
		$this->formatter = $formatter;
27
28
		$this->disablePHPDisplayErrors();
29
30
		$this->registerErrorHandler();
31
		$this->registerExceptionHandler();
32
		$this->registerShutdownHandler();
33
	}
34
35
	protected function disablePHPDisplayErrors()
36
	{
37
		ini_set('display_errors', false);
38
	}
39
40
	/**
41
	 * Register the PHP error handler.
42
	 *
43
	 * @return void
44
	 */
45
	protected function registerErrorHandler()
46
	{
47
		set_error_handler([$this, self::ERROR_HANDLER]);
48
	}
49
50
	/**
51
	 * Register the PHP exception handler.
52
	 *
53
	 * @return void
54
	 */
55
	protected function registerExceptionHandler()
56
	{
57
		set_exception_handler([$this, self::EXCEPTION_HANDLER]);
58
	}
59
60
	/**
61
	 * Register a function for execution on shutdown
62
	 *
63
	 * @return void
64
	 */
65
	protected function registerShutdownHandler()
66
	{
67
		register_shutdown_function([$this, self::SHUTDOWN_HANDLER]);
68
	}
69
70
	/**
71
	 * @param int $level
72
	 * @param string $message
73
	 * @param string $file
74
	 * @param int $line
75
	 * @param array $context
76
	 *
77
	 * @throws ErrorException
78
	 */
79
	public function handleError(int $level, string $message, string $file = '', int $line = 0, array $context = [])
0 ignored issues
show
Unused Code introduced by
The parameter $context is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
80
	{
81
		throw new ErrorException($message, 0, $level, $file, $line);
82
	}
83
84
	/**
85
	 * @param \Throwable $e
86
	 */
87
	public function handleException(\Throwable $e)
88
	{
89
		ob_start();
90
		$response = json_encode($this->formatter->format($e));
91
		ob_end_clean();
92
		http_response_code(500);
93
		print $response;
94
		return;
95
	}
96
97
	/**
98
	 *
99
	 */
100
	public function handleShutdown()
101
	{
102
		$error = error_get_last();
103
		echo 'ok';
104
		if ($error) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $error of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
105
			$this->handleException(new ErrorException($error['type'], $error['message'], $error['file'], $error['line']));
106
		}
107
	}
108
}