forked from spatie/laravel-data
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPaginatedDataCollection.php
89 lines (76 loc) · 2.7 KB
/
PaginatedDataCollection.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
<?php
namespace Spatie\LaravelData;
use Closure;
use Countable;
use Illuminate\Contracts\Pagination\Paginator;
use Illuminate\Contracts\Support\Responsable;
use IteratorAggregate;
use Spatie\LaravelData\Concerns\BaseDataCollectable;
use Spatie\LaravelData\Concerns\ContextableData;
use Spatie\LaravelData\Concerns\IncludeableData;
use Spatie\LaravelData\Concerns\ResponsableData;
use Spatie\LaravelData\Concerns\TransformableData;
use Spatie\LaravelData\Concerns\WrappableData;
use Spatie\LaravelData\Contracts\BaseDataCollectable as BaseDataCollectableContract;
use Spatie\LaravelData\Contracts\IncludeableData as IncludeableDataContract;
use Spatie\LaravelData\Contracts\ResponsableData as ResponsableDataContract;
use Spatie\LaravelData\Contracts\TransformableData as TransformableDataContract;
use Spatie\LaravelData\Contracts\WrappableData as WrappableDataContract;
use Spatie\LaravelData\Exceptions\CannotCastData;
use Spatie\LaravelData\Exceptions\PaginatedCollectionIsAlwaysWrapped;
use Spatie\LaravelData\Support\EloquentCasts\DataCollectionEloquentCast;
/**
* @template TKey of array-key
* @template TValue
*
* @implements IteratorAggregate<TKey, TValue>
*/
class PaginatedDataCollection implements Responsable, BaseDataCollectableContract, TransformableDataContract, ResponsableDataContract, IncludeableDataContract, WrappableDataContract, IteratorAggregate, Countable
{
use ResponsableData;
use IncludeableData;
use WrappableData;
use TransformableData;
/** @use \Spatie\LaravelData\Concerns\BaseDataCollectable<TKey, TValue> */
use BaseDataCollectable;
use ContextableData;
protected Paginator $items;
/**
* @param class-string<TValue> $dataClass
* @param Paginator $items
*/
public function __construct(
public readonly string $dataClass,
Paginator $items
) {
$this->items = $items->through(
fn ($item) => $item instanceof $this->dataClass ? $item : $this->dataClass::from($item)
);
}
/**
* @param Closure(TValue, TKey): TValue $through
*
* @return static<TKey, TValue>
*/
public function through(Closure $through): static
{
$clone = clone $this;
$clone->items = $clone->items->through($through);
return $clone;
}
public function items(): Paginator
{
return $this->items;
}
public static function castUsing(array $arguments)
{
if (count($arguments) !== 1) {
throw CannotCastData::dataCollectionTypeRequired();
}
return new DataCollectionEloquentCast(current($arguments));
}
public function withoutWrapping(): static
{
throw PaginatedCollectionIsAlwaysWrapped::create();
}
}