Skip to content

Commit 34c2363

Browse files
manual written present attribute rule always overwrites a generated required rule
1 parent d5cdc09 commit 34c2363

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

src/RuleInferrers/AttributesRuleInferrer.php

+7
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
namespace Spatie\LaravelData\RuleInferrers;
44

5+
use Spatie\LaravelData\Attributes\Validation\Present;
6+
use Spatie\LaravelData\Attributes\Validation\Required;
57
use Spatie\LaravelData\Support\DataProperty;
68
use Spatie\LaravelData\Support\Validation\PropertyRules;
9+
use Spatie\LaravelData\Support\Validation\RequiringRule;
710
use Spatie\LaravelData\Support\Validation\RuleNormalizer;
811
use Spatie\LaravelData\Support\Validation\ValidationContext;
912
use Spatie\LaravelData\Support\Validation\ValidationRule;
@@ -23,6 +26,10 @@ public function handle(
2326
->attributes
2427
->filter(fn (object $attribute) => $attribute instanceof ValidationRule)
2528
->each(function (ValidationRule $rule) use ($rules) {
29+
if($rule instanceof Present && $rules->hasType(RequiringRule::class)) {
30+
$rules->removeType(RequiringRule::class);
31+
}
32+
2633
$rules->add(
2734
...$this->rulesDenormalizer->execute($rule)
2835
);

tests/DataTest.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Spatie\LaravelData\Attributes\DataCollectionOf;
1313
use Spatie\LaravelData\Attributes\MapOutputName;
1414
use Spatie\LaravelData\Attributes\Validation\Min;
15+
use Spatie\LaravelData\Attributes\Validation\Present;
1516
use Spatie\LaravelData\Attributes\WithCast;
1617
use Spatie\LaravelData\Attributes\WithCastable;
1718
use Spatie\LaravelData\Attributes\WithTransformer;
@@ -66,7 +67,6 @@
6667
use Spatie\LaravelData\Tests\Fakes\UnionData;
6768
use Spatie\LaravelData\Transformers\DateTimeInterfaceTransformer;
6869
use Spatie\LaravelData\WithData;
69-
7070
use function Spatie\Snapshots\assertMatchesSnapshot;
7171

7272
it('can create a resource', function () {

tests/ValidationTest.php

+16
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
use Spatie\LaravelData\Attributes\Validation\Max;
2727
use Spatie\LaravelData\Attributes\Validation\Min;
2828
use Spatie\LaravelData\Attributes\Validation\Nullable;
29+
use Spatie\LaravelData\Attributes\Validation\Present;
2930
use Spatie\LaravelData\Attributes\Validation\Required;
3031
use Spatie\LaravelData\Attributes\Validation\RequiredIf;
3132
use Spatie\LaravelData\Attributes\Validation\RequiredWith;
@@ -2202,3 +2203,18 @@ public static function rules(ValidationContext $context): array
22022203
'default' => ['required', 'string', 'min:10'],
22032204
], ['default' => 'something']);
22042205
});
2206+
2207+
it('a manual written present attribute rule always overwrites a generated required rule', function () {
2208+
$dataClass = new class () extends Data {
2209+
#[Present]
2210+
public array $array;
2211+
};
2212+
2213+
DataValidationAsserter::for($dataClass)
2214+
->assertOk(['array' => []])
2215+
->assertOk(['array' => ['a', 'b']])
2216+
->assertErrors(['array' => null])
2217+
->assertRules([
2218+
'array' => ['array', 'present'],
2219+
], []);
2220+
});

0 commit comments

Comments
 (0)