Skip to content

Commit

Permalink
Add RequiredArrayKeys validation attribute
Browse files Browse the repository at this point in the history
  • Loading branch information
Klaas058 committed Oct 2, 2023
1 parent 03812ba commit 5018f10
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 0 deletions.
15 changes: 15 additions & 0 deletions docs/advanced-usage/validation-attributes.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
28 changes: 28 additions & 0 deletions src/Attributes/Validation/RequiredArrayKeys.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

namespace Spatie\LaravelData\Attributes\Validation;

use Attribute;
use Illuminate\Support\Arr;
use Spatie\LaravelData\Support\Validation\References\RouteParameterReference;

#[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_PARAMETER)]
class RequiredArrayKeys extends StringValidationAttribute
{
protected string|array $values;

public function __construct(string|array|RouteParameterReference ...$values)
{
$this->values = Arr::flatten($values);
}

public static function keyword(): string
{
return 'required_array_keys';
}

public function parameters(): array
{
return [$this->values];
}
}
2 changes: 2 additions & 0 deletions src/Support/Validation/ValidationRuleFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down
20 changes: 20 additions & 0 deletions tests/Datasets/Attributes/RulesDataset.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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(
Expand Down

0 comments on commit 5018f10

Please sign in to comment.