Skip to content

Commit 8fcea39

Browse files
committed
Added non finished approach to validation (will be abandoned)
1 parent 70516d9 commit 8fcea39

File tree

9 files changed

+113
-35
lines changed

9 files changed

+113
-35
lines changed

docs/DataValidation.md

Lines changed: 0 additions & 26 deletions
This file was deleted.

src/Concerns/ValidateableData.php

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?php
2+
3+
namespace Nuxtifyts\PhpDto\Concerns;
4+
5+
use Nuxtifyts\PhpDto\Configuration\DataConfiguration;
6+
use Nuxtifyts\PhpDto\Contexts\ClassContext;
7+
use Nuxtifyts\PhpDto\Exceptions\DataCreationException;
8+
use Nuxtifyts\PhpDto\Exceptions\DataValidationException;
9+
10+
use Throwable;
11+
use Exception;
12+
13+
trait ValidateableData
14+
{
15+
/**
16+
* @throws DataValidationException
17+
*/
18+
public static function validate(mixed $data): void
19+
{
20+
try {
21+
$validationConfig = DataConfiguration::getInstance()->validation;
22+
23+
$validationRules = $validationConfig->validationRulesRefererClass::createInstance()
24+
->getRulesFromClassContext(ClassContext::getInstance(static::class));
25+
26+
$validationConfig
27+
->validatorClass::createInstance($validationRules)
28+
->validate($data);
29+
} catch (Throwable $t) {
30+
throw DataValidationException::invalidData($t->getMessage(), previous: $t);
31+
}
32+
}
33+
34+
/**
35+
* @param array<string, mixed> $data
36+
*
37+
* @throws DataValidationException
38+
*/
39+
public static function validateAndCreate(array $data): static
40+
{
41+
try {
42+
/** @var ClassContext<static> $context */
43+
$context = ClassContext::getInstance(static::class);
44+
45+
$value = static::normalizeValue($args, static::class, $context->normalizers)
46+
?: static::normalizeValue($args[0] ?? [], static::class, $context->normalizers);
47+
48+
if ($value === false) {
49+
throw DataCreationException::invalidParamsPassed(static::class);
50+
}
51+
52+
// Add Validate Data pipe
53+
} catch (Throwable $t) {
54+
throw DataValidationException::invalidData($t->getMessage(), previous: $t);
55+
}
56+
}
57+
58+
public function isValid(): bool
59+
{
60+
try {
61+
$this::validate($this->toArray());
62+
63+
return true;
64+
} catch (Exception) {
65+
return false;
66+
}
67+
}
68+
69+
/**
70+
* @param ?array<array-key, mixed> $data
71+
*
72+
* @return array<string, mixed>
73+
*/
74+
public static function validationRules(?array $data = null): array
75+
{
76+
return [];
77+
}
78+
}

src/Contracts/ValidateableData.php

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,14 @@ interface ValidateableData
1111
*
1212
* @throws DataValidationException
1313
*/
14-
public static function validate(array $data): void;
14+
public static function validate(mixed $data): void;
1515

1616
/**
17-
* @param array<string, mixed> $data
18-
*
1917
* @throws DataValidationException
2018
*/
21-
public static function validateAndCreate(array $data): static;
19+
public static function validateAndCreate(mixed $data): static;
2220

23-
/**
24-
* @return true|array<string, array<string>>
25-
*/
26-
public function isValid(): true|array;
21+
public function isValid(): bool;
2722

2823
/**
2924
* @param ?array<array-key, mixed> $data

src/Data.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,20 @@
55
use Nuxtifyts\PhpDto\Contracts\BaseData as BaseDataContract;
66
use Nuxtifyts\PhpDto\Contracts\EmptyData as EmptyDataContract;
77
use Nuxtifyts\PhpDto\Contracts\CloneableData as CloneableDataContract;
8+
use Nuxtifyts\PhpDto\Contracts\ValidateableData as ValidateableDataContract;
89
use Nuxtifyts\PhpDto\Concerns\BaseData;
910
use Nuxtifyts\PhpDto\Concerns\EmptyData;
1011
use Nuxtifyts\PhpDto\Concerns\CloneableData;
12+
use Nuxtifyts\PhpDto\Concerns\ValidateableData;
1113

1214
abstract readonly class Data implements
1315
BaseDataContract,
1416
EmptyDataContract,
15-
CloneableDataContract
17+
CloneableDataContract,
18+
ValidateableDataContract
1619
{
1720
use BaseData;
1821
use EmptyData;
1922
use CloneableData;
23+
use ValidateableData;
2024
}

src/Exceptions/DataValidationException.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,14 @@
33
namespace Nuxtifyts\PhpDto\Exceptions;
44

55
use Exception;
6+
use Throwable;
67

78
class DataValidationException extends Exception
89
{
10+
protected const int INVALID_DATA_CODE = 0;
11+
12+
public static function invalidData(string $message, int $code = self::INVALID_DATA_CODE, ?Throwable $previous = null): self
13+
{
14+
return new self($message, $code, $previous);
15+
}
916
}

src/Support/Validation/Contracts/DataValidator.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@
66

77
interface DataValidator
88
{
9+
/**
10+
* @param array<string, mixed> $rules
11+
*/
12+
public static function createInstance(array $rules): self;
13+
914
/**
1015
* @param array<array-key, mixed> $value
1116
*

src/Support/Validation/Contracts/RuleReferer.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
interface RuleReferer
99
{
10+
public static function createInstance(): self;
11+
1012
/**
1113
* @template T of Data
1214
*

src/Support/Validation/ValidationRulesReferer.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@
88

99
final readonly class ValidationRulesReferer implements RuleReferer
1010
{
11+
public static function createInstance(mixed ...$args): self
12+
{
13+
return new self();
14+
}
15+
1116
/**
1217
* @template T of Data
1318
*

src/Support/Validation/Validator.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@
66

77
final readonly class Validator implements DataValidator
88
{
9+
/**
10+
* @param array<string, mixed> $rules
11+
*/
12+
public static function createInstance(array $rules): self
13+
{
14+
return new self();
15+
}
16+
917
/**
1018
* @param array<array-key, mixed> $value
1119
*

0 commit comments

Comments
 (0)