Skip to content

Commit a9fcdef

Browse files
committed
chore: Use attributes-php/options instead of custom options
1 parent 0853ab8 commit a9fcdef

File tree

9 files changed

+121
-129
lines changed

9 files changed

+121
-129
lines changed

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
"license": "MIT",
1111
"require": {
1212
"php": "^8.1",
13-
"respect/validation": "^2.0"
13+
"respect/validation": "^2.0",
14+
"attributes-php/options": "^0.1"
1415
},
1516
"autoload": {
1617
"psr-4": {

composer.lock

Lines changed: 50 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Exceptions/InvalidOptionException.php

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

src/Options/Alias.php

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

src/Options/AliasGenerator.php

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

src/Validator.php

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55
namespace Attributes\Validation;
66

7+
use Attributes\Options;
8+
use Attributes\Options\Exceptions\InvalidOptionException;
79
use Attributes\Validation\Exceptions\ContextPropertyException;
810
use Attributes\Validation\Exceptions\ContinueValidationException;
9-
use Attributes\Validation\Exceptions\InvalidOptionException;
1011
use Attributes\Validation\Exceptions\StopValidationException;
1112
use Attributes\Validation\Exceptions\ValidationException;
12-
use Attributes\Validation\Options as Options;
1313
use Attributes\Validation\Validators\AttributesValidator;
1414
use Attributes\Validation\Validators\ChainValidator;
1515
use Attributes\Validation\Validators\PropertyValidator;
@@ -56,6 +56,7 @@ public function __construct(?PropertyValidator $validator = null, bool $stopFirs
5656
* @throws ValidationException - If validation fails
5757
* @throws ContextPropertyException - If unable to retrieve a given context property
5858
* @throws ReflectionException
59+
* @throws InvalidOptionException
5960
*/
6061
public function validate(array $data, string|object $model): object
6162
{
@@ -75,6 +76,10 @@ public function validate(array $data, string|object $model): object
7576
$this->context->set(ErrorHolder::class, $errorInfo, override: true);
7677
$defaultAliasGenerator = $this->getDefaultAliasGenerator($reflectionClass);
7778
foreach ($reflectionClass->getProperties() as $reflectionProperty) {
79+
if (! $this->isToValidate($reflectionProperty)) {
80+
continue;
81+
}
82+
7883
$propertyName = $reflectionProperty->getName();
7984
$aliasName = $this->getAliasName($reflectionProperty, $defaultAliasGenerator);
8085
$this->context->push('internal.currentProperty', $propertyName);
@@ -162,4 +167,19 @@ private function getAliasName(ReflectionProperty $reflectionProperty, callable $
162167

163168
return $defaultAliasGenerator($propertyName);
164169
}
170+
171+
/**
172+
* Checks if a given property is to be ignored
173+
*/
174+
private function isToValidate(ReflectionProperty $reflectionProperty): bool
175+
{
176+
$allAttributes = $reflectionProperty->getAttributes(Options\Ignore::class);
177+
foreach ($allAttributes as $attribute) {
178+
$instance = $attribute->newInstance();
179+
180+
return ! $instance->ignoreValidation();
181+
}
182+
183+
return true;
184+
}
165185
}

tests/Integration/OptionsTest.php

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,14 @@
1212

1313
namespace Attributes\Validation\Tests\Integration;
1414

15-
use Attributes\Validation\Exceptions\ValidationException;
16-
use Attributes\Validation\Options as Options;
15+
use Attributes\Options as Options;
16+
use Attributes\Options\Exceptions\InvalidOptionException;
17+
use Attributes\Options\Ignore;
1718
use Attributes\Validation\Tests\Models as Models;
1819
use Attributes\Validation\Validator;
1920

21+
// Alias and alias generator
22+
2023
test('Alias/AliasGenerator options', function (bool $isStrict) {
2124
$validator = new Validator(strict: $isStrict);
2225
$rawData = [
@@ -37,7 +40,9 @@
3740
->toHaveProperty('my_title', 'My Post Title');
3841
})
3942
->with([true, false])
40-
->group('validator', 'options', 'nested');
43+
->group('validator', 'options', 'alias', 'alias-generator');
44+
45+
// Alias generator
4146

4247
test('AliasGenerator camelCase', function (bool $isStrict) {
4348
$validator = new Validator(strict: $isStrict);
@@ -60,7 +65,7 @@
6065
->toHaveProperty('camelCaseName', 'camel');
6166
})
6267
->with([true, false])
63-
->group('validator', 'options', 'basic');
68+
->group('validator', 'options', 'alias-generator');
6469

6570
test('AliasGenerator PascalCase', function (bool $isStrict) {
6671
$validator = new Validator(strict: $isStrict);
@@ -83,7 +88,7 @@
8388
->toHaveProperty('camelCaseName', 'camel');
8489
})
8590
->with([true, false])
86-
->group('validator', 'options', 'basic');
91+
->group('validator', 'options', 'alias-generator');
8792

8893
test('AliasGenerator SnakeCase', function (bool $isStrict) {
8994
$validator = new Validator(strict: $isStrict);
@@ -106,7 +111,7 @@
106111
->toHaveProperty('camelCaseName', 'camel');
107112
})
108113
->with([true, false])
109-
->group('validator', 'options', 'basic');
114+
->group('validator', 'options', 'alias-generator');
110115

111116
test('Invalid AliasGenerator', function (bool $isStrict) {
112117
$validator = new Validator(strict: $isStrict);
@@ -116,5 +121,32 @@
116121
});
117122
})
118123
->with([true, false])
119-
->throws(ValidationException::class, 'Invalid alias generator \'invalid\'')
120-
->group('validator', 'options', 'basic');
124+
->throws(InvalidOptionException::class, 'Invalid alias generator \'invalid\'')
125+
->group('validator', 'options', 'alias-generator');
126+
127+
// Ignore
128+
129+
test('Ignore', function (bool $isStrict) {
130+
$validator = new Validator(strict: $isStrict);
131+
$rawData = [
132+
'value' => 'my value',
133+
'ignore' => 'ignored',
134+
'ignoreValidation' => 'ignored',
135+
];
136+
$model = $validator->validate($rawData, new class
137+
{
138+
public string $value;
139+
140+
#[Ignore]
141+
public string $ignore = 'original';
142+
143+
#[Ignore(serialization: false)]
144+
public string $ignoreValidation = 'original';
145+
});
146+
expect($model)
147+
->toHaveProperty('value', 'my value')
148+
->toHaveProperty('ignore', 'original')
149+
->toHaveProperty('ignoreValidation', 'original');
150+
})
151+
->with([true, false])
152+
->group('validator', 'options', 'ignore');

tests/Integration/UnionAndIntersectionTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@
153153
->toMatchArray($value);
154154
})
155155
->with([[[1, 2, 3]], [['hello', 'bro', 'another']]])
156-
->group('validator', 'union', 'hey');
156+
->group('validator', 'union');
157157

158158
/*** Intersection ***/
159159

tests/Models/Complex/Options.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
namespace Attributes\Validation\Tests\Models\Complex;
44

5-
use Attributes\Validation\Options\Alias;
6-
use Attributes\Validation\Options\AliasGenerator;
5+
use Attributes\Options\Alias;
6+
use Attributes\Options\AliasGenerator;
7+
use Attributes\Options\Ignore;
78
use Respect\Validation\Rules as Rules;
89

910
#[AliasGenerator('camel')]
@@ -14,6 +15,9 @@ class Post
1415

1516
#[Rules\NotEmpty]
1617
public string $my_title;
18+
19+
#[Ignore]
20+
public string $privateData;
1721
}
1822

1923
class Profile

0 commit comments

Comments
 (0)