diff --git a/docs/advanced-usage/validation-attributes.md b/docs/advanced-usage/validation-attributes.md index 578db49e..bdbafbb0 100644 --- a/docs/advanced-usage/validation-attributes.md +++ b/docs/advanced-usage/validation-attributes.md @@ -794,6 +794,21 @@ public ?string $closure; public ?string $closure; ``` +### RequiredArrayKeys + +[Docs](https://laravel.com/docs/9.x/validation#rule-required-array-keys) + +```php +#[RequiredArrayKeys('a')] +public array $closure; + +#[RequiredArrayKeys(['a', 'b'])] +public array $closure; + +#[RequiredArrayKeys('a', 'b')] +public array $closure; +``` + ### Rule ```php diff --git a/src/Attributes/Validation/RequiredArrayKeys.php b/src/Attributes/Validation/RequiredArrayKeys.php new file mode 100644 index 00000000..1119fe5c --- /dev/null +++ b/src/Attributes/Validation/RequiredArrayKeys.php @@ -0,0 +1,28 @@ +values = Arr::flatten($values); + } + + public static function keyword(): string + { + return 'required_array_keys'; + } + + public function parameters(): array + { + return [$this->values]; + } +} diff --git a/src/Support/Validation/ValidationRuleFactory.php b/src/Support/Validation/ValidationRuleFactory.php index ebd06162..f6f75483 100644 --- a/src/Support/Validation/ValidationRuleFactory.php +++ b/src/Support/Validation/ValidationRuleFactory.php @@ -66,6 +66,7 @@ use Spatie\LaravelData\Attributes\Validation\Prohibits; use Spatie\LaravelData\Attributes\Validation\Regex; use Spatie\LaravelData\Attributes\Validation\Required; +use Spatie\LaravelData\Attributes\Validation\RequiredArrayKeys; use Spatie\LaravelData\Attributes\Validation\RequiredIf; use Spatie\LaravelData\Attributes\Validation\RequiredUnless; use Spatie\LaravelData\Attributes\Validation\RequiredWith; @@ -165,6 +166,7 @@ protected function mapping(): array Prohibits::keyword() => Prohibits::class, Regex::keyword() => Regex::class, Required::keyword() => Required::class, + RequiredArrayKeys::keyword() => RequiredArrayKeys::class, RequiredIf::keyword() => RequiredIf::class, RequiredUnless::keyword() => RequiredUnless::class, RequiredWith::keyword() => RequiredWith::class, diff --git a/tests/Datasets/Attributes/RulesDataset.php b/tests/Datasets/Attributes/RulesDataset.php index d91fc8f9..340c372f 100644 --- a/tests/Datasets/Attributes/RulesDataset.php +++ b/tests/Datasets/Attributes/RulesDataset.php @@ -69,6 +69,7 @@ use Spatie\LaravelData\Attributes\Validation\Prohibits; use Spatie\LaravelData\Attributes\Validation\Regex; use Spatie\LaravelData\Attributes\Validation\Required; +use Spatie\LaravelData\Attributes\Validation\RequiredArrayKeys; use Spatie\LaravelData\Attributes\Validation\RequiredIf; use Spatie\LaravelData\Attributes\Validation\RequiredUnless; use Spatie\LaravelData\Attributes\Validation\RequiredWith; @@ -126,6 +127,7 @@ function fixature( yield from prohibitedIfAttributes(); yield from prohibitedUnlessAttributes(); yield from prohibitsAttributes(); + yield from requiredArrayKeysAttributes(); yield from requiredIfAttributes(); yield from requiredUnlessAttributes(); yield from requiredWithAttributes(); @@ -845,6 +847,24 @@ function prohibitsAttributes(): Generator ); } +function requiredArrayKeysAttributes(): Generator +{ + yield fixature( + attribute: new RequiredArrayKeys('x'), + expected: 'required_array_keys:x', + ); + + yield fixature( + attribute: new RequiredArrayKeys(['x', 'y']), + expected: 'required_array_keys:x,y', + ); + + yield fixature( + attribute: new RequiredArrayKeys('x', 'y'), + expected: 'required_array_keys:x,y', + ); +} + function requiredIfAttributes(): Generator { yield fixature(