generated from spatie/package-skeleton-laravel
-
-
Notifications
You must be signed in to change notification settings - Fork 207
/
BaseData.php
117 lines (99 loc) · 4.06 KB
/
BaseData.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<?php
namespace Spatie\LaravelData\Concerns;
use Illuminate\Contracts\Pagination\CursorPaginator;
use Illuminate\Contracts\Pagination\Paginator;
use Illuminate\Pagination\AbstractCursorPaginator;
use Illuminate\Pagination\AbstractPaginator;
use Illuminate\Support\Enumerable;
use Spatie\LaravelData\CursorPaginatedDataCollection;
use Spatie\LaravelData\DataCollection;
use Spatie\LaravelData\DataPipeline;
use Spatie\LaravelData\DataPipes\AuthorizedDataPipe;
use Spatie\LaravelData\DataPipes\CastPropertiesDataPipe;
use Spatie\LaravelData\DataPipes\DefaultValuesDataPipe;
use Spatie\LaravelData\DataPipes\FillRouteParameterPropertiesDataPipe;
use Spatie\LaravelData\DataPipes\MapPropertiesDataPipe;
use Spatie\LaravelData\DataPipes\ValidatePropertiesDataPipe;
use Spatie\LaravelData\PaginatedDataCollection;
use Spatie\LaravelData\Resolvers\DataFromSomethingResolver;
use Spatie\LaravelData\Resolvers\EmptyDataResolver;
use Spatie\LaravelData\Support\DataConfig;
use Spatie\LaravelData\Support\DataProperty;
use Spatie\LaravelData\Support\Wrapping\WrapExecutionType;
use Spatie\LaravelData\Transformers\DataTransformer;
trait BaseData
{
protected static string $_collectionClass = DataCollection::class;
protected static string $_paginatedCollectionClass = PaginatedDataCollection::class;
protected static string $_cursorPaginatedCollectionClass = CursorPaginatedDataCollection::class;
public static function optional(mixed ...$payloads): ?static
{
if (count($payloads) === 0) {
return null;
}
foreach ($payloads as $payload) {
if ($payload !== null) {
return static::from(...$payloads);
}
}
return null;
}
public static function from(mixed ...$payloads): static
{
return app(DataFromSomethingResolver::class)->execute(
static::class,
...$payloads
);
}
public static function withoutMagicalCreationFrom(mixed ...$payloads): static
{
return app(DataFromSomethingResolver::class)->withoutMagicalCreation()->execute(
static::class,
...$payloads
);
}
public static function normalizers(): array
{
return config('data.normalizers');
}
public static function pipeline(): DataPipeline
{
return DataPipeline::create()
->into(static::class)
->through(AuthorizedDataPipe::class)
->through(MapPropertiesDataPipe::class)
->through(FillRouteParameterPropertiesDataPipe::class)
->through(ValidatePropertiesDataPipe::class)
->through(DefaultValuesDataPipe::class)
->through(CastPropertiesDataPipe::class);
}
public static function collection(Enumerable|array|AbstractPaginator|Paginator|AbstractCursorPaginator|CursorPaginator|DataCollection $items): DataCollection|CursorPaginatedDataCollection|PaginatedDataCollection
{
if ($items instanceof Paginator || $items instanceof AbstractPaginator) {
return new (static::$_paginatedCollectionClass)(static::class, $items);
}
if ($items instanceof AbstractCursorPaginator || $items instanceof CursorPaginator) {
return new (static::$_cursorPaginatedCollectionClass)(static::class, $items);
}
return new (static::$_collectionClass)(static::class, $items);
}
public static function empty(array $extra = []): array
{
return app(EmptyDataResolver::class)->execute(static::class, $extra);
}
public function transform(
bool $transformValues = true,
WrapExecutionType $wrapExecutionType = WrapExecutionType::Disabled,
bool $mapPropertyNames = true,
): array {
return DataTransformer::create($transformValues, $wrapExecutionType, $mapPropertyNames)->transform($this);
}
public function __sleep(): array
{
return app(DataConfig::class)->getDataClass(static::class)
->properties
->map(fn (DataProperty $property) => $property->name)
->push('_additional')
->toArray();
}
}