Skip to content

Commit 70516d9

Browse files
committed
Added DataConfiguration for Validation
1 parent 5c57ef4 commit 70516d9

File tree

11 files changed

+248
-1
lines changed

11 files changed

+248
-1
lines changed

docs/DataConfiguration.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ DataConfiguration::getInstance([
3838
BackedEnumSerializer::class,
3939
ScalarTypeSerializer::class,
4040
]
41-
]
41+
],
42+
43+
'validation' => [
44+
'ruleReferer' => ValidationRulesReferer::class,
45+
'validator' => Validator::class,
46+
]
4247
])
4348
```

src/Configuration/DataConfiguration.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ class DataConfiguration implements Configuration
1212
protected function __construct(
1313
protected(set) NormalizersConfiguration $normalizers,
1414
protected(set) SerializersConfiguration $serializers,
15+
protected(set) ValidationConfiguration $validation,
1516
) {
1617
}
1718

@@ -36,6 +37,10 @@ public static function getInstance(
3637
serializers: SerializersConfiguration::getInstance(
3738
Arr::getArray($config ?? [], 'serializers'),
3839
$forceCreate
40+
),
41+
validation: ValidationConfiguration::getInstance(
42+
Arr::getArray($config ?? [], 'validation'),
43+
$forceCreate
3944
)
4045
);
4146
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
3+
namespace Nuxtifyts\PhpDto\Configuration;
4+
5+
use Nuxtifyts\PhpDto\Exceptions\DataConfigurationException;
6+
use Nuxtifyts\PhpDto\Support\Arr;
7+
use Nuxtifyts\PhpDto\Support\Validation\Contracts\DataValidator;
8+
use Nuxtifyts\PhpDto\Support\Validation\Contracts\RuleReferer;
9+
use Nuxtifyts\PhpDto\Support\Validation\ValidationRulesReferer;
10+
use Nuxtifyts\PhpDto\Support\Validation\Validator;
11+
12+
class ValidationConfiguration implements Configuration
13+
{
14+
protected static ?self $instance = null;
15+
16+
/**
17+
* @param class-string<DataValidator> $validatorClass
18+
* @param class-string<RuleReferer> $validationRulesRefererClass
19+
*/
20+
protected function __construct(
21+
protected(set) string $validatorClass,
22+
protected(set) string $validationRulesRefererClass
23+
) {
24+
}
25+
26+
/**
27+
* @param ?array<array-key, mixed> $config
28+
*
29+
* @throws DataConfigurationException
30+
*/
31+
public static function getInstance(
32+
?array $config = null,
33+
bool $forceCreate = false
34+
): self {
35+
if (self::$instance && !$forceCreate) {
36+
return self::$instance;
37+
}
38+
39+
$validatorClass = Arr::getString($config ?? [], 'validator', Validator::class);
40+
41+
$validationRulesRefererClass = Arr::getString(
42+
$config ?? [],
43+
'ruleReferer',
44+
ValidationRulesReferer::class
45+
);
46+
47+
if (
48+
!$validatorClass
49+
|| !class_exists($validatorClass)
50+
|| !is_subclass_of($validatorClass, DataValidator::class)
51+
52+
|| !$validationRulesRefererClass
53+
|| !class_exists($validationRulesRefererClass)
54+
|| !is_subclass_of($validationRulesRefererClass, RuleReferer::class)
55+
) {
56+
throw DataConfigurationException::invalidValidationClasses();
57+
}
58+
59+
return self::$instance = new self(
60+
validatorClass: $validatorClass,
61+
validationRulesRefererClass: $validationRulesRefererClass
62+
);
63+
}
64+
}

src/Contracts/ValidateableData.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace Nuxtifyts\PhpDto\Contracts;
4+
5+
use Nuxtifyts\PhpDto\Exceptions\DataValidationException;
6+
7+
interface ValidateableData
8+
{
9+
/**
10+
* @param array<string, mixed> $data
11+
*
12+
* @throws DataValidationException
13+
*/
14+
public static function validate(array $data): void;
15+
16+
/**
17+
* @param array<string, mixed> $data
18+
*
19+
* @throws DataValidationException
20+
*/
21+
public static function validateAndCreate(array $data): static;
22+
23+
/**
24+
* @return true|array<string, array<string>>
25+
*/
26+
public function isValid(): true|array;
27+
28+
/**
29+
* @param ?array<array-key, mixed> $data
30+
*
31+
* @return array<string, mixed>
32+
*/
33+
public static function validationRules(?array $data = null): array;
34+
}

src/Exceptions/DataConfigurationException.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class DataConfigurationException extends Exception
99
protected const int INVALID_BASE_SERIALIZERS = 10000;
1010

1111
protected const int INVALID_BASE_NORMALIZERS = 20000;
12+
protected const int INVALID_VALIDATION_CLASSES = 30000;
1213

1314
public static function invalidBaseSerializers(): self
1415
{
@@ -19,4 +20,9 @@ public static function invalidBaseNormalizers(): self
1920
{
2021
return new self('Invalid base normalizers', self::INVALID_BASE_NORMALIZERS);
2122
}
23+
24+
public static function invalidValidationClasses(): self
25+
{
26+
return new self('Invalid validation classes', self::INVALID_VALIDATION_CLASSES);
27+
}
2228
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace Nuxtifyts\PhpDto\Exceptions;
4+
5+
use Exception;
6+
7+
class DataValidationException extends Exception
8+
{
9+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Nuxtifyts\PhpDto\Support\Validation\Contracts;
4+
5+
use Throwable;
6+
7+
interface DataValidator
8+
{
9+
/**
10+
* @param array<array-key, mixed> $value
11+
*
12+
* @return array<array-key, mixed>
13+
*
14+
* @throws Throwable
15+
*/
16+
public static function validate(array $value): array;
17+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace Nuxtifyts\PhpDto\Support\Validation\Contracts;
4+
5+
use Nuxtifyts\PhpDto\Contexts\ClassContext;
6+
use Nuxtifyts\PhpDto\Data;
7+
8+
interface RuleReferer
9+
{
10+
/**
11+
* @template T of Data
12+
*
13+
* @param ClassContext<T> $classContext
14+
*
15+
* @return list<string>|array<string, mixed>
16+
*/
17+
public static function getRulesFromClassContext(ClassContext $classContext): array;
18+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace Nuxtifyts\PhpDto\Support\Validation;
4+
5+
use Nuxtifyts\PhpDto\Data;
6+
use Nuxtifyts\PhpDto\Support\Validation\Contracts\RuleReferer;
7+
use Nuxtifyts\PhpDto\Contexts\ClassContext;
8+
9+
final readonly class ValidationRulesReferer implements RuleReferer
10+
{
11+
/**
12+
* @template T of Data
13+
*
14+
* @param ClassContext<T> $classContext
15+
*
16+
* @return list<string>|array<string, mixed>
17+
*/
18+
public static function getRulesFromClassContext(ClassContext $classContext): array
19+
{
20+
return []; // Rule referer should be replaced from config.
21+
}
22+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Nuxtifyts\PhpDto\Support\Validation;
4+
5+
use Nuxtifyts\PhpDto\Support\Validation\Contracts\DataValidator;
6+
7+
final readonly class Validator implements DataValidator
8+
{
9+
/**
10+
* @param array<array-key, mixed> $value
11+
*
12+
* @return array<array-key, mixed>
13+
*
14+
*/
15+
public static function validate(array $value): array
16+
{
17+
return $value; // Validator should be replaced from config.
18+
}
19+
}

0 commit comments

Comments
 (0)