1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Flugg\Responder\Http; |
4
|
|
|
|
5
|
|
|
use InvalidArgumentException; |
6
|
|
|
|
7
|
|
|
/** |
8
|
|
|
* This class represents an error response. An error response is responsible for translating |
9
|
|
|
* and resolving messages from error code and turning them into an error JSON response. |
10
|
|
|
* |
11
|
|
|
* @package flugger/laravel-responder |
12
|
|
|
* @author Alexander Tømmerås <[email protected]> |
13
|
|
|
* @license The MIT License |
14
|
|
|
*/ |
15
|
|
|
class ErrorResponseBuilder extends ResponseBuilder |
16
|
|
|
{ |
17
|
|
|
/** |
18
|
|
|
* Optional error data appended with the response. |
19
|
|
|
* |
20
|
|
|
* @var array |
21
|
|
|
*/ |
22
|
|
|
protected $data = []; |
23
|
|
|
|
24
|
|
|
/** |
25
|
|
|
* The error code used to identify the error. |
26
|
|
|
* |
27
|
|
|
* @var string |
28
|
|
|
*/ |
29
|
|
|
protected $errorCode; |
30
|
|
|
|
31
|
|
|
/** |
32
|
|
|
* A descriptive error message explaining what went wrong. |
33
|
|
|
* |
34
|
|
|
* @var string |
35
|
|
|
*/ |
36
|
|
|
protected $message; |
37
|
|
|
|
38
|
|
|
/** |
39
|
|
|
* Any parameters used to build the error message. |
40
|
|
|
* |
41
|
|
|
* @var array |
42
|
|
|
*/ |
43
|
|
|
protected $parameters = []; |
44
|
|
|
|
45
|
|
|
/** |
46
|
|
|
* The HTTP status code for the response. |
47
|
|
|
* |
48
|
|
|
* @var int |
49
|
|
|
*/ |
50
|
|
|
protected $statusCode = 500; |
51
|
|
|
|
52
|
|
|
/** |
53
|
|
|
* Translator service used for translating stuff. |
54
|
|
|
* |
55
|
|
|
* @var \Symfony\Component\Translation\TranslatorInterface|Illuminate\Contracts\Translation\Translator |
56
|
|
|
*/ |
57
|
|
|
protected $translator; |
58
|
|
|
|
59
|
|
|
/** |
60
|
|
|
* Constructor. |
61
|
|
|
* |
62
|
|
|
* @param \Illuminate\Contracts\Routing\ResponseFactory|\Laravel\Lumen\Http\ResponseFactory $responseFactory |
63
|
|
|
* @param \Symfony\Component\Translation\TranslatorInterface|Illuminate\Contracts\Translation\Translator $translator |
64
|
|
|
*/ |
65
|
|
|
public function __construct($responseFactory, $translator) |
66
|
|
|
{ |
67
|
|
|
$this->translator = $translator; |
68
|
|
|
|
69
|
|
|
parent::__construct($responseFactory); |
70
|
|
|
} |
71
|
|
|
|
72
|
|
|
/** |
73
|
|
|
* Add additonal data appended to the error object. |
74
|
|
|
* |
75
|
|
|
* @param array $data |
76
|
|
|
* @return self |
77
|
|
|
*/ |
78
|
|
|
public function addData(array $data):ErrorResponseBuilder |
79
|
|
|
{ |
80
|
|
|
$this->data = array_merge($this->data, $data); |
81
|
|
|
|
82
|
|
|
return $this; |
83
|
|
|
} |
84
|
|
|
|
85
|
|
|
/** |
86
|
|
|
* Set the error code and optionally an error message. |
87
|
|
|
* |
88
|
|
|
* @param mixed|null $errorCode |
89
|
|
|
* @param string|array|null $message |
90
|
|
|
* @return self |
91
|
|
|
*/ |
92
|
|
|
public function setError($errorCode = null, $message = null):ErrorResponseBuilder |
93
|
|
|
{ |
94
|
|
|
$this->errorCode = $errorCode; |
95
|
|
|
|
96
|
|
|
if (is_array($message)) { |
97
|
|
|
$this->parameters = $message; |
98
|
|
|
} else { |
99
|
|
|
$this->message = $message; |
100
|
|
|
} |
101
|
|
|
|
102
|
|
|
return $this; |
103
|
|
|
} |
104
|
|
|
|
105
|
|
|
/** |
106
|
|
|
* Set the HTTP status code for the response. |
107
|
|
|
* |
108
|
|
|
* @param int $statusCode |
109
|
|
|
* @return self |
110
|
|
|
* @throws \InvalidArgumentException |
111
|
|
|
*/ |
112
|
|
View Code Duplication |
public function setStatus(int $statusCode):ResponseBuilder |
|
|
|
|
113
|
|
|
{ |
114
|
|
|
if ($statusCode < 400 || $statusCode >= 600) { |
115
|
|
|
throw new InvalidArgumentException("{$statusCode} is not a valid error HTTP status code."); |
|
|
|
|
116
|
|
|
} |
117
|
|
|
return parent::setStatus($statusCode); |
118
|
|
|
} |
119
|
|
|
|
120
|
|
|
/** |
121
|
|
|
* Return response success flag as true |
122
|
|
|
* |
123
|
|
|
* @return bool |
124
|
|
|
*/ |
125
|
|
|
protected function isSuccessResponse():bool |
126
|
|
|
{ |
127
|
|
|
return false; |
128
|
|
|
} |
129
|
|
|
|
130
|
|
|
/** |
131
|
|
|
* Serialize the data and return as an array. |
132
|
|
|
* |
133
|
|
|
* @return array |
134
|
|
|
*/ |
135
|
|
|
public function toArray():array |
136
|
|
|
{ |
137
|
|
|
return [ |
138
|
|
|
'error' => $this->buildErrorData() |
139
|
|
|
]; |
140
|
|
|
} |
141
|
|
|
|
142
|
|
|
/** |
143
|
|
|
* Build the error object of the serialized response data. |
144
|
|
|
* |
145
|
|
|
* @return array|null |
146
|
|
|
*/ |
147
|
|
|
protected function buildErrorData() |
148
|
|
|
{ |
149
|
|
|
if (is_null($this->errorCode)) { |
150
|
|
|
return null; |
151
|
|
|
} |
152
|
|
|
|
153
|
|
|
$data = [ |
154
|
|
|
'code' => $this->errorCode, |
155
|
|
|
'message' => $this->message ?: $this->resolveMessage() |
156
|
|
|
]; |
157
|
|
|
|
158
|
|
|
return array_merge($data, $this->data); |
159
|
|
|
} |
160
|
|
|
|
161
|
|
|
/** |
162
|
|
|
* Resolve an error message from the translator. |
163
|
|
|
* |
164
|
|
|
* @return string|null |
165
|
|
|
*/ |
166
|
|
|
protected function resolveMessage() |
167
|
|
|
{ |
168
|
|
|
if (! $this->translator->has($code = "errors.$this->errorCode")) { |
|
|
|
|
169
|
|
|
return null; |
170
|
|
|
} |
171
|
|
|
|
172
|
|
|
return $this->translator->trans($code, $this->parameters); |
173
|
|
|
} |
174
|
|
|
} |
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.