Skip to content

Commit

Permalink
Merge branch 'main' into beyond-data
Browse files Browse the repository at this point in the history
# Conflicts:
#	CHANGELOG.md
#	docs/advanced-usage/validation-attributes.md
#	docs/as-a-data-transfer-object/creating-a-data-object.md
#	src/Transformers/DataTransformer.php
  • Loading branch information
rubenvanassche committed Oct 13, 2023
2 parents c53bf7c + f47d3f0 commit d56e076
Show file tree
Hide file tree
Showing 16 changed files with 311 additions and 8 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/php-cs-fixer.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ jobs:
args: --config=.php-cs-fixer.dist.php --allow-risky=yes

- name: Commit changes
uses: stefanzweifel/git-auto-commit-action@v4
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: Fix styling
2 changes: 1 addition & 1 deletion .github/workflows/update-changelog.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
release-notes: ${{ github.event.release.body }}

- name: Commit updated CHANGELOG
uses: stefanzweifel/git-auto-commit-action@v4
uses: stefanzweifel/git-auto-commit-action@v5
with:
branch: main
commit_message: Update CHANGELOG
Expand Down
10 changes: 9 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,15 @@ All notable changes to `laravel-data` will be documented in this file.
- Allow creating data objects using `from` without parameters
- Add support for a Dto and Resource object

## 3.9.1 - 2023-10-12

- Add Declined and DeclinedIf validation attributes (#572)
- Add MacAddress validation attribute (#573)
- Add RequiredArrayKeys validation attribute (#574)
- Support Arrayable when casting to DataCollection (#577)
- Fetch attributes from parent classes to allow reusability (#581)
- Fix issue where non-set optional values would be transformed

## 3.9.0 - 2023-09-15

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

## 3.7.0 - 2023-07-05

Expand Down
46 changes: 44 additions & 2 deletions docs/advanced-usage/validation-attributes.md
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,24 @@ public Carbon $closure;
public Carbon $closure;
```

## Declined

[Docs](https://laravel.com/docs/9.x/validation#rule-declined)

```php
#[Declined]
public bool $closure;
```

## DeclinedIf

[Docs](https://laravel.com/docs/9.x/validation#rule-declined-if)

```php
#[DeclinedIf('other_field', 'equals_this')]
public bool $closure;
```

## Different

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

## IPv4

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

```php
#[IPv4]
Expand All @@ -461,7 +479,7 @@ public string $closure;

## IPv6

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

```php
#[IPv6]
Expand Down Expand Up @@ -495,6 +513,15 @@ public int $closure;
public int $closure;
```

## MacAddress

[Docs](https://laravel.com/docs/9.x/validation#rule-mac)

```php
#[MacAddress]
public string $closure;
```

## Max

[Docs](https://laravel.com/docs/9.x/validation#rule-max)
Expand Down Expand Up @@ -759,6 +786,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
19 changes: 19 additions & 0 deletions src/Attributes/Validation/Declined.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace Spatie\LaravelData\Attributes\Validation;

use Attribute;

#[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_PARAMETER)]
class Declined extends StringValidationAttribute
{
public static function keyword(): string
{
return 'declined';
}

public function parameters(): array
{
return [];
}
}
39 changes: 39 additions & 0 deletions src/Attributes/Validation/DeclinedIf.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

namespace Spatie\LaravelData\Attributes\Validation;

use Attribute;
use BackedEnum;
use Spatie\LaravelData\Support\Validation\References\FieldReference;
use Spatie\LaravelData\Support\Validation\References\RouteParameterReference;

#[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_PARAMETER)]
class DeclinedIf extends StringValidationAttribute
{
protected FieldReference $field;

public function __construct(
string|FieldReference $field,
protected string|bool|int|float|BackedEnum|RouteParameterReference $value,
) {
$this->field = $this->parseFieldReference($field);
}

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

public function parameters(): array
{
return [$this->field, $this->value];
}

public static function create(string ...$parameters): static
{
return parent::create(
$parameters[0],
self::parseBooleanValue($parameters[1]),
);
}
}
19 changes: 19 additions & 0 deletions src/Attributes/Validation/MacAddress.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace Spatie\LaravelData\Attributes\Validation;

use Attribute;

#[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_PARAMETER)]
class MacAddress extends StringValidationAttribute
{
public static function keyword(): string
{
return 'mac_address';
}

public function parameters(): array
{
return [];
}
}
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];
}
}
20 changes: 17 additions & 3 deletions src/Support/DataClass.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,7 @@ public function __construct(

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

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

Expand Down Expand Up @@ -98,6 +96,22 @@ public static function create(ReflectionClass $class): self
);
}

protected static function resolveAttributes(
ReflectionClass $class
): Collection {
$attributes = collect($class->getAttributes())
->filter(fn (ReflectionAttribute $reflectionAttribute) => class_exists($reflectionAttribute->getName()))
->map(fn (ReflectionAttribute $reflectionAttribute) => $reflectionAttribute->newInstance());

$parent = $class->getParentClass();

if ($parent !== false) {
$attributes = $attributes->merge(static::resolveAttributes($parent));
}

return $attributes;
}

protected static function resolveMethods(
ReflectionClass $reflectionClass,
): Collection {
Expand Down
5 changes: 5 additions & 0 deletions src/Support/EloquentCasts/DataCollectionEloquentCast.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Spatie\LaravelData\Support\EloquentCasts;

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

if ($value instanceof Arrayable) {
$value = $value->toArray();
}

if (! is_array($value)) {
throw CannotCastData::shouldBeArray($model::class, $key);
}
Expand Down
8 changes: 8 additions & 0 deletions src/Support/Validation/ValidationRuleFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
use Spatie\LaravelData\Attributes\Validation\Date;
use Spatie\LaravelData\Attributes\Validation\DateEquals;
use Spatie\LaravelData\Attributes\Validation\DateFormat;
use Spatie\LaravelData\Attributes\Validation\Declined;
use Spatie\LaravelData\Attributes\Validation\DeclinedIf;
use Spatie\LaravelData\Attributes\Validation\Different;
use Spatie\LaravelData\Attributes\Validation\Digits;
use Spatie\LaravelData\Attributes\Validation\DigitsBetween;
Expand All @@ -49,6 +51,7 @@
use Spatie\LaravelData\Attributes\Validation\Json;
use Spatie\LaravelData\Attributes\Validation\LessThan;
use Spatie\LaravelData\Attributes\Validation\LessThanOrEqualTo;
use Spatie\LaravelData\Attributes\Validation\MacAddress;
use Spatie\LaravelData\Attributes\Validation\Max;
use Spatie\LaravelData\Attributes\Validation\Mimes;
use Spatie\LaravelData\Attributes\Validation\MimeTypes;
Expand All @@ -66,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 @@ -122,6 +126,8 @@ protected function mapping(): array
Date::keyword() => Date::class,
DateEquals::keyword() => DateEquals::class,
DateFormat::keyword() => DateFormat::class,
Declined::keyword() => Declined::class,
DeclinedIf::keyword() => DeclinedIf::class,
Different::keyword() => Different::class,
Digits::keyword() => Digits::class,
DigitsBetween::keyword() => DigitsBetween::class,
Expand All @@ -148,6 +154,7 @@ protected function mapping(): array
Json::keyword() => Json::class,
LessThan::keyword() => LessThan::class,
LessThanOrEqualTo::keyword() => LessThanOrEqualTo::class,
MacAddress::keyword() => MacAddress::class,
Max::keyword() => Max::class,
Mimes::keyword() => Mimes::class,
MimeTypes::keyword() => MimeTypes::class,
Expand All @@ -165,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
Empty file.
Loading

0 comments on commit d56e076

Please sign in to comment.