Skip to content

Commit

Permalink
Merge pull request #574 from Klaas058/klaas058/add-required-array-key…
Browse files Browse the repository at this point in the history
…s-attribute

Add RequiredArrayKeys validation attribute
  • Loading branch information
rubenvanassche authored Oct 12, 2023
2 parents b654b65 + 5018f10 commit 119a408
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 @@ -821,6 +821,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 @@ -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 @@ -171,6 +172,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 @@ -72,6 +72,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 @@ -130,6 +131,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 @@ -889,6 +891,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 119a408

Please sign in to comment.