Completed
Pull Request — master (#148)
by Marcin
08:39 queued 05:32
created

HttpExceptionHandler::handle()   A

Complexity

Conditions 4
Paths 8

Size

Total Lines 36
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 4
eloc 17
c 2
b 0
f 0
nc 8
nop 2
dl 0
loc 36
rs 9.7
1
<?php
2
declare(strict_types=1);
3
4
namespace MarcinOrlowski\ResponseBuilder\ExceptionHandlers;
5
6
/**
7
 * Laravel API Response Builder
8
 *
9
 * @package   MarcinOrlowski\ResponseBuilder
10
 *
11
 * @author    Marcin Orlowski <mail (#) marcinOrlowski (.) com>
12
 * @copyright 2016-2020 Marcin Orlowski
13
 * @license   http://www.opensource.org/licenses/mit-license.php MIT
14
 * @link      https://github.com/MarcinOrlowski/laravel-api-response-builder
15
 */
16
17
use MarcinOrlowski\ResponseBuilder\BaseApiCodes;
18
use MarcinOrlowski\ResponseBuilder\Contracts\ExceptionHandlerContract;
19
use MarcinOrlowski\ResponseBuilder\ResponseBuilder;
20
use Symfony\Component\HttpFoundation\Response as HttpResponse;
21
22
final class HttpExceptionHandler implements ExceptionHandlerContract
23
{
24
	public function handle(array $user_config, \Exception $ex): ?array
25
	{
26
		$default_config = [
27
			// used by unauthenticated() to obtain api and http code for the exception
28
			HttpResponse::HTTP_UNAUTHORIZED         => [
29
				'api_code' => BaseApiCodes::EX_AUTHENTICATION_EXCEPTION(),
30
			],
31
			// Required by ValidationException handler
32
			HttpResponse::HTTP_UNPROCESSABLE_ENTITY => [
33
				'api_code' => BaseApiCodes::EX_VALIDATION_EXCEPTION(),
34
			],
35
36
			// Default entry MUST exists. Enforced by unit tests.
37
			ResponseBuilder::KEY_DEFAULT            => [
38
				'api_code' => BaseApiCodes::EX_HTTP_EXCEPTION(),
39
			],
40
		];
41
42
		$config = \array_replace($default_config, $user_config);
43
44
		$http_code = $ex->getStatusCode();
0 ignored issues
show
Bug introduced by
The method getStatusCode() does not exist on Exception. It seems like you code against a sub-type of Exception such as Symfony\Component\HttpKe...Exception\HttpException. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

44
		/** @scrutinizer ignore-call */ 
45
  $http_code = $ex->getStatusCode();
Loading history...
45
		$result = $config[ $http_code ] ?? null;
46
47
		// If we do not have dedicated entry fort this particular http_code,
48
		// fall back to default value.
49
		if ($result === null) {
50
			$result = $config[ ResponseBuilder::KEY_DEFAULT ];
51
		}
52
53
		if (!\array_key_exists(ResponseBuilder::KEY_HTTP_CODE, $result)) {
54
			$result[ ResponseBuilder::KEY_HTTP_CODE ] = $http_code;
55
		}
56
		if (!\array_key_exists(ResponseBuilder::KEY_MSG_KEY, $result)) {
57
			$result[ ResponseBuilder::KEY_MSG_KEY ] = \sprintf('response-builder::builder.http_%d', $http_code);
58
		}
59
		return $result;
60
	}
61
}
62