Skip to content

Commit d56e076

Browse files
Merge branch 'main' into beyond-data
# Conflicts: # CHANGELOG.md # docs/advanced-usage/validation-attributes.md # docs/as-a-data-transfer-object/creating-a-data-object.md # src/Transformers/DataTransformer.php
2 parents c53bf7c + f47d3f0 commit d56e076

File tree

16 files changed

+311
-8
lines changed

16 files changed

+311
-8
lines changed

.github/workflows/php-cs-fixer.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ jobs:
1818
args: --config=.php-cs-fixer.dist.php --allow-risky=yes
1919

2020
- name: Commit changes
21-
uses: stefanzweifel/git-auto-commit-action@v4
21+
uses: stefanzweifel/git-auto-commit-action@v5
2222
with:
2323
commit_message: Fix styling

.github/workflows/update-changelog.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
release-notes: ${{ github.event.release.body }}
2222

2323
- name: Commit updated CHANGELOG
24-
uses: stefanzweifel/git-auto-commit-action@v4
24+
uses: stefanzweifel/git-auto-commit-action@v5
2525
with:
2626
branch: main
2727
commit_message: Update CHANGELOG

CHANGELOG.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,15 @@ All notable changes to `laravel-data` will be documented in this file.
1414
- Allow creating data objects using `from` without parameters
1515
- Add support for a Dto and Resource object
1616

17+
## 3.9.1 - 2023-10-12
18+
19+
- Add Declined and DeclinedIf validation attributes (#572)
20+
- Add MacAddress validation attribute (#573)
21+
- Add RequiredArrayKeys validation attribute (#574)
22+
- Support Arrayable when casting to DataCollection (#577)
23+
- Fetch attributes from parent classes to allow reusability (#581)
24+
- Fix issue where non-set optional values would be transformed
25+
1726
## 3.9.0 - 2023-09-15
1827

1928
- Fix an issue where computed values could not be set as null
@@ -37,7 +46,6 @@ All notable changes to `laravel-data` will be documented in this file.
3746
- allow collection to be created passing null (#507)
3847
- add Ulid validation rule (#510)
3948
-add TARGET_PARAMETER to Attribute for improved Validation (#523)
40-
>>>>>>> main
4149

4250
## 3.7.0 - 2023-07-05
4351

docs/advanced-usage/validation-attributes.md

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,24 @@ public Carbon $closure;
216216
public Carbon $closure;
217217
```
218218

219+
## Declined
220+
221+
[Docs](https://laravel.com/docs/9.x/validation#rule-declined)
222+
223+
```php
224+
#[Declined]
225+
public bool $closure;
226+
```
227+
228+
## DeclinedIf
229+
230+
[Docs](https://laravel.com/docs/9.x/validation#rule-declined-if)
231+
232+
```php
233+
#[DeclinedIf('other_field', 'equals_this')]
234+
public bool $closure;
235+
```
236+
219237
## Different
220238

221239
[Docs](https://laravel.com/docs/9.x/validation#rule-different)
@@ -452,7 +470,7 @@ public string $closure;
452470

453471
## IPv4
454472

455-
[Docs](https://laravel.com/docs/9.x/validation#rule-ipv4)
473+
[Docs](https://laravel.com/docs/9.x/validation#ipv4)
456474

457475
```php
458476
#[IPv4]
@@ -461,7 +479,7 @@ public string $closure;
461479

462480
## IPv6
463481

464-
[Docs](https://laravel.com/docs/9.x/validation#rule-ipv6)
482+
[Docs](https://laravel.com/docs/9.x/validation#ipv6)
465483

466484
```php
467485
#[IPv6]
@@ -495,6 +513,15 @@ public int $closure;
495513
public int $closure;
496514
```
497515

516+
## MacAddress
517+
518+
[Docs](https://laravel.com/docs/9.x/validation#rule-mac)
519+
520+
```php
521+
#[MacAddress]
522+
public string $closure;
523+
```
524+
498525
## Max
499526

500527
[Docs](https://laravel.com/docs/9.x/validation#rule-max)
@@ -759,6 +786,21 @@ public ?string $closure;
759786
public ?string $closure;
760787
```
761788

789+
## RequiredArrayKeys
790+
791+
[Docs](https://laravel.com/docs/9.x/validation#rule-required-array-keys)
792+
793+
```php
794+
#[RequiredArrayKeys('a')]
795+
public array $closure;
796+
797+
#[RequiredArrayKeys(['a', 'b'])]
798+
public array $closure;
799+
800+
#[RequiredArrayKeys('a', 'b')]
801+
public array $closure;
802+
```
803+
762804
## Rule
763805

764806
```php
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Spatie\LaravelData\Attributes\Validation;
4+
5+
use Attribute;
6+
7+
#[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_PARAMETER)]
8+
class Declined extends StringValidationAttribute
9+
{
10+
public static function keyword(): string
11+
{
12+
return 'declined';
13+
}
14+
15+
public function parameters(): array
16+
{
17+
return [];
18+
}
19+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
namespace Spatie\LaravelData\Attributes\Validation;
4+
5+
use Attribute;
6+
use BackedEnum;
7+
use Spatie\LaravelData\Support\Validation\References\FieldReference;
8+
use Spatie\LaravelData\Support\Validation\References\RouteParameterReference;
9+
10+
#[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_PARAMETER)]
11+
class DeclinedIf extends StringValidationAttribute
12+
{
13+
protected FieldReference $field;
14+
15+
public function __construct(
16+
string|FieldReference $field,
17+
protected string|bool|int|float|BackedEnum|RouteParameterReference $value,
18+
) {
19+
$this->field = $this->parseFieldReference($field);
20+
}
21+
22+
public static function keyword(): string
23+
{
24+
return 'declined_if';
25+
}
26+
27+
public function parameters(): array
28+
{
29+
return [$this->field, $this->value];
30+
}
31+
32+
public static function create(string ...$parameters): static
33+
{
34+
return parent::create(
35+
$parameters[0],
36+
self::parseBooleanValue($parameters[1]),
37+
);
38+
}
39+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Spatie\LaravelData\Attributes\Validation;
4+
5+
use Attribute;
6+
7+
#[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_PARAMETER)]
8+
class MacAddress extends StringValidationAttribute
9+
{
10+
public static function keyword(): string
11+
{
12+
return 'mac_address';
13+
}
14+
15+
public function parameters(): array
16+
{
17+
return [];
18+
}
19+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace Spatie\LaravelData\Attributes\Validation;
4+
5+
use Attribute;
6+
use Illuminate\Support\Arr;
7+
use Spatie\LaravelData\Support\Validation\References\RouteParameterReference;
8+
9+
#[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_PARAMETER)]
10+
class RequiredArrayKeys extends StringValidationAttribute
11+
{
12+
protected string|array $values;
13+
14+
public function __construct(string|array|RouteParameterReference ...$values)
15+
{
16+
$this->values = Arr::flatten($values);
17+
}
18+
19+
public static function keyword(): string
20+
{
21+
return 'required_array_keys';
22+
}
23+
24+
public function parameters(): array
25+
{
26+
return [$this->values];
27+
}
28+
}

src/Support/DataClass.php

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,7 @@ public function __construct(
5454

5555
public static function create(ReflectionClass $class): self
5656
{
57-
$attributes = collect($class->getAttributes())
58-
->filter(fn (ReflectionAttribute $reflectionAttribute) => class_exists($reflectionAttribute->getName()))
59-
->map(fn (ReflectionAttribute $reflectionAttribute) => $reflectionAttribute->newInstance());
57+
$attributes = static::resolveAttributes($class);
6058

6159
$methods = collect($class->getMethods());
6260

@@ -98,6 +96,22 @@ public static function create(ReflectionClass $class): self
9896
);
9997
}
10098

99+
protected static function resolveAttributes(
100+
ReflectionClass $class
101+
): Collection {
102+
$attributes = collect($class->getAttributes())
103+
->filter(fn (ReflectionAttribute $reflectionAttribute) => class_exists($reflectionAttribute->getName()))
104+
->map(fn (ReflectionAttribute $reflectionAttribute) => $reflectionAttribute->newInstance());
105+
106+
$parent = $class->getParentClass();
107+
108+
if ($parent !== false) {
109+
$attributes = $attributes->merge(static::resolveAttributes($parent));
110+
}
111+
112+
return $attributes;
113+
}
114+
101115
protected static function resolveMethods(
102116
ReflectionClass $reflectionClass,
103117
): Collection {

src/Support/EloquentCasts/DataCollectionEloquentCast.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Spatie\LaravelData\Support\EloquentCasts;
44

55
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
6+
use Illuminate\Contracts\Support\Arrayable;
67
use Spatie\LaravelData\Contracts\BaseData;
78
use Spatie\LaravelData\Contracts\BaseDataCollectable;
89
use Spatie\LaravelData\Contracts\TransformableData;
@@ -48,6 +49,10 @@ public function set($model, string $key, $value, array $attributes): ?string
4849
$value = $value->all();
4950
}
5051

52+
if ($value instanceof Arrayable) {
53+
$value = $value->toArray();
54+
}
55+
5156
if (! is_array($value)) {
5257
throw CannotCastData::shouldBeArray($model::class, $key);
5358
}

src/Support/Validation/ValidationRuleFactory.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
use Spatie\LaravelData\Attributes\Validation\Date;
2424
use Spatie\LaravelData\Attributes\Validation\DateEquals;
2525
use Spatie\LaravelData\Attributes\Validation\DateFormat;
26+
use Spatie\LaravelData\Attributes\Validation\Declined;
27+
use Spatie\LaravelData\Attributes\Validation\DeclinedIf;
2628
use Spatie\LaravelData\Attributes\Validation\Different;
2729
use Spatie\LaravelData\Attributes\Validation\Digits;
2830
use Spatie\LaravelData\Attributes\Validation\DigitsBetween;
@@ -49,6 +51,7 @@
4951
use Spatie\LaravelData\Attributes\Validation\Json;
5052
use Spatie\LaravelData\Attributes\Validation\LessThan;
5153
use Spatie\LaravelData\Attributes\Validation\LessThanOrEqualTo;
54+
use Spatie\LaravelData\Attributes\Validation\MacAddress;
5255
use Spatie\LaravelData\Attributes\Validation\Max;
5356
use Spatie\LaravelData\Attributes\Validation\Mimes;
5457
use Spatie\LaravelData\Attributes\Validation\MimeTypes;
@@ -66,6 +69,7 @@
6669
use Spatie\LaravelData\Attributes\Validation\Prohibits;
6770
use Spatie\LaravelData\Attributes\Validation\Regex;
6871
use Spatie\LaravelData\Attributes\Validation\Required;
72+
use Spatie\LaravelData\Attributes\Validation\RequiredArrayKeys;
6973
use Spatie\LaravelData\Attributes\Validation\RequiredIf;
7074
use Spatie\LaravelData\Attributes\Validation\RequiredUnless;
7175
use Spatie\LaravelData\Attributes\Validation\RequiredWith;
@@ -122,6 +126,8 @@ protected function mapping(): array
122126
Date::keyword() => Date::class,
123127
DateEquals::keyword() => DateEquals::class,
124128
DateFormat::keyword() => DateFormat::class,
129+
Declined::keyword() => Declined::class,
130+
DeclinedIf::keyword() => DeclinedIf::class,
125131
Different::keyword() => Different::class,
126132
Digits::keyword() => Digits::class,
127133
DigitsBetween::keyword() => DigitsBetween::class,
@@ -148,6 +154,7 @@ protected function mapping(): array
148154
Json::keyword() => Json::class,
149155
LessThan::keyword() => LessThan::class,
150156
LessThanOrEqualTo::keyword() => LessThanOrEqualTo::class,
157+
MacAddress::keyword() => MacAddress::class,
151158
Max::keyword() => Max::class,
152159
Mimes::keyword() => Mimes::class,
153160
MimeTypes::keyword() => MimeTypes::class,
@@ -165,6 +172,7 @@ protected function mapping(): array
165172
Prohibits::keyword() => Prohibits::class,
166173
Regex::keyword() => Regex::class,
167174
Required::keyword() => Required::class,
175+
RequiredArrayKeys::keyword() => RequiredArrayKeys::class,
168176
RequiredIf::keyword() => RequiredIf::class,
169177
RequiredUnless::keyword() => RequiredUnless::class,
170178
RequiredWith::keyword() => RequiredWith::class,

src/Transformers/DataTransformer.php

Whitespace-only changes.

0 commit comments

Comments
 (0)