Skip to content

Commit 225f5c1

Browse files
committed
Replace collector concept with validator factories
1 parent 7fac1dc commit 225f5c1

File tree

4 files changed

+31
-89
lines changed

4 files changed

+31
-89
lines changed

README.md

Lines changed: 2 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ composer require cakephp/validation
263263

264264
use Cake\Validation\Validator;
265265
use Selective\Validation\Exception\ValidationException;
266-
use Selective\Validation\Collector\CakeValidationErrorCollector;
266+
use Selective\Validation\Factory\CakeValidatorFactory;
267267

268268
// Note: This is just an example. Don't use the $request object within the domain layer.
269269
$formData = (array)$request->getParsedBody();
@@ -278,8 +278,7 @@ $validator
278278
->requirePresence('comment')
279279
->notEmpty('comment', 'You need to give a comment.');
280280

281-
$validationResult = (new CakeValidationErrorCollector)
282-
->addErrors($validator->validate($formData));
281+
$validationResult = CakeValidatorFactory::createValidationResult($validator->validate($formData));
283282

284283
// Optional: Do more complex validation and append it to the validation result
285284
if (!$this->existsEmailInDatabase($formData['email'])) {
@@ -291,41 +290,6 @@ if ($validationResult->isFailed()) {
291290
}
292291
```
293292

294-
Instead of instantiating the `Validator` and `CakeValidationErrorCollector` yourself, you could use a factory like this
295-
296-
```php
297-
<?php
298-
299-
namespace App\Validation;
300-
301-
use Cake\Validation\Validator;
302-
use Selective\Validation\Collector\CakeValidationErrorCollector;
303-
use Selective\Validation\Collector\ValidationErrorCollectorInterface;
304-
305-
final class ValidationFactory
306-
{
307-
/**
308-
* Create validator.
309-
*
310-
* @return Validator The validator
311-
*/
312-
public function createValidator(): Validator
313-
{
314-
return new Validator();
315-
}
316-
317-
/**
318-
* Create a error collector.
319-
*
320-
* @return ValidationErrorCollectorInterface The error collector
321-
*/
322-
public function createErrorCollector(): ValidationErrorCollectorInterface
323-
{
324-
return new CakeValidationErrorCollector();
325-
}
326-
}
327-
```
328-
329293
**Usage**
330294

331295
```php

src/Collector/ValidationErrorCollectorInterface.php

Lines changed: 0 additions & 24 deletions
This file was deleted.
Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,57 @@
11
<?php
22

3-
namespace Selective\Validation\Collector;
3+
namespace Selective\Validation\Factory;
44

55
use Selective\Validation\ValidationResult;
66

77
/**
88
* CakePHP validation error collector.
99
*/
10-
final class CakeValidationErrorCollector implements ValidationErrorCollectorInterface
10+
final class CakeValidatorFactory
1111
{
1212
/**
1313
* Create validation result from array with errors.
1414
*
1515
* @param array<mixed> $errors The validation errors
16-
* @param ValidationResult $result The result
17-
* @param string $path The path
16+
* @param ValidationResult|null $result The result
1817
*
1918
* @return ValidationResult The result
2019
*/
21-
public function addErrors(
22-
$errors,
23-
ValidationResult $result = null,
24-
string $path = ''
25-
): ValidationResult {
20+
public static function createValidationResult(array $errors, ValidationResult $result = null): ValidationResult
21+
{
2622
if ($result === null) {
2723
$result = new ValidationResult();
2824
}
2925

26+
static::addErrors($result, $errors);
27+
28+
return $result;
29+
}
30+
31+
/**
32+
* Add errors.
33+
*
34+
* @param ValidationResult $result The result
35+
* @param array $errors The errors
36+
* @param string $path The path
37+
*
38+
* @return void
39+
*/
40+
private static function addErrors(ValidationResult $result, array $errors, string $path = ''): void
41+
{
3042
foreach ($errors as $field => $error) {
3143
$oldPath = $path;
3244
$path .= ($path === '' ? '' : '.') . $field;
3345

3446
foreach ($error as $field2 => $errorMessage) {
3547
if (is_array($errorMessage)) {
36-
$result = $this->addErrors([$field2 => $errorMessage], $result, $path);
48+
static::addErrors($result, [$field2 => $errorMessage], $path);
3749
} else {
3850
$result->addError($path, $errorMessage);
3951
}
4052
}
4153

4254
$path = $oldPath;
4355
}
44-
45-
return $result;
4656
}
4757
}

tests/Collector/CakeValidationErrorCollectorTest.php renamed to tests/Factory/CakeValidationFactoryTest.php

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
<?php
22

3-
namespace Selective\Validation\Test\Collector;
3+
namespace Selective\Validation\Test\Factory;
44

55
use PHPUnit\Framework\TestCase;
6-
use Selective\Validation\Collector\CakeValidationErrorCollector;
6+
use Selective\Validation\Factory\CakeValidatorFactory;
77
use Selective\Validation\Transformer\ErrorDetailsResultTransformer;
88
use Selective\Validation\ValidationResult;
99

1010
/**
1111
* Tests.
1212
*/
13-
class CakeValidationErrorCollectorTest extends TestCase
13+
class CakeValidationFactoryTest extends TestCase
1414
{
1515
/**
1616
* Convert validation details to array.
@@ -31,9 +31,7 @@ private function getValidationResultAsArray(ValidationResult $validationResult):
3131
*/
3232
public function testCreateResultFromErrorsSimple()
3333
{
34-
$errorCollector = new CakeValidationErrorCollector();
35-
36-
$errors = [
34+
$result = CakeValidatorFactory::createValidationResult([
3735
'first_name' => [
3836
'_empty' => 'This field cannot be left empty',
3937
],
@@ -58,9 +56,7 @@ public function testCreateResultFromErrorsSimple()
5856
'street' => [
5957
'_empty' => 'This field cannot be left empty',
6058
],
61-
];
62-
63-
$result = $errorCollector->addErrors($errors);
59+
]);
6460

6561
$errors = $this->getValidationResultAsArray($result);
6662
$expected = [
@@ -108,9 +104,7 @@ public function testCreateResultFromErrorsSimple()
108104
*/
109105
public function testCreateResultFromErrorsNestedArray()
110106
{
111-
$errorCollector = new CakeValidationErrorCollector();
112-
113-
$errors = [
107+
$result = CakeValidatorFactory::createValidationResult([
114108
'bills' => [
115109
0 => [
116110
'billing_number' => [
@@ -137,9 +131,7 @@ public function testCreateResultFromErrorsNestedArray()
137131
],
138132
],
139133
],
140-
];
141-
142-
$result = $errorCollector->addErrors($errors);
134+
]);
143135

144136
$errors = $this->getValidationResultAsArray($result);
145137
$expected = [

0 commit comments

Comments
 (0)