1 | <?php |
||
27 | class Validator implements ValidatableInterface |
||
28 | { |
||
29 | |||
30 | /** |
||
31 | * Model instance |
||
32 | * @var AnnotatedInterface |
||
33 | */ |
||
34 | private $model = null; |
||
35 | |||
36 | /** |
||
37 | * Metadata for model |
||
38 | * @var ManganMeta |
||
39 | */ |
||
40 | private $meta = null; |
||
41 | |||
42 | /** |
||
43 | * Array of error messages. |
||
44 | * Keys are field names, secondary keys are numeric |
||
45 | * @var string[][] |
||
46 | */ |
||
47 | private $errors = []; |
||
48 | |||
49 | 136 | public function __construct(AnnotatedInterface $model) |
|
60 | |||
61 | /** |
||
62 | * Validate model, optionally only selected fields |
||
63 | * @param string[] $fields |
||
64 | * @return boolean |
||
65 | */ |
||
66 | 100 | public function validate($fields = []) |
|
150 | |||
151 | 22 | private function validateEntity($name, $validators) |
|
152 | { |
||
153 | 22 | $valid = []; |
|
154 | 22 | foreach ($validators as $validatorMeta) |
|
155 | { |
||
156 | // Filter out validators based on scenarios |
||
157 | 22 | if (!empty($validatorMeta->on)) |
|
158 | { |
||
159 | 2 | $on = (array)$validatorMeta->on; |
|
160 | 2 | $enabled = false; |
|
161 | 2 | foreach ($on as $scenario) |
|
162 | { |
||
163 | 2 | if ($scenario === ScenarioManager::getScenario($this->model)) |
|
164 | { |
||
165 | 2 | $enabled = true; |
|
166 | 2 | break; |
|
167 | } |
||
168 | } |
||
169 | 2 | if (!$enabled) |
|
170 | { |
||
171 | 2 | continue; |
|
172 | } |
||
173 | } |
||
174 | 22 | if (!empty($validatorMeta->except)) |
|
175 | { |
||
176 | 1 | $except = (array)$validatorMeta->except; |
|
177 | 1 | $enabled = true; |
|
178 | 1 | foreach ($except as $scenario) |
|
179 | { |
||
180 | 1 | if ($scenario === ScenarioManager::getScenario($this->model)) |
|
181 | { |
||
182 | 1 | $enabled = false; |
|
183 | 1 | break; |
|
184 | } |
||
185 | } |
||
186 | 1 | if (!$enabled) |
|
187 | { |
||
188 | 1 | continue; |
|
189 | } |
||
190 | } |
||
191 | |||
192 | |||
193 | // Create validator and validate |
||
194 | 22 | $validator = Factory::create($this->model, $validatorMeta, $name); |
|
195 | 22 | if ($validator->isValid($this->model, $name)) |
|
196 | { |
||
197 | 18 | $valid[] = true; |
|
198 | } else |
||
199 | { |
||
200 | 22 | $valid[] = false; |
|
201 | 22 | $this->errors[$name] = array_merge($this->errors[$name], $validator->getErrors()); |
|
202 | |||
203 | // Set errors to model instance if it implements ValidatableInterface |
||
204 | 22 | if ($this->model instanceof ValidatableInterface) |
|
205 | { |
||
206 | 22 | $this->model->setErrors($this->errors); |
|
207 | } |
||
208 | } |
||
209 | } |
||
210 | 22 | return count($valid) === array_sum($valid); |
|
211 | } |
||
212 | |||
213 | 10 | public function getErrors() |
|
217 | |||
218 | 12 | public function setErrors($errors) |
|
225 | |||
226 | } |
||
227 |