File tree Expand file tree Collapse file tree 3 files changed +43
-5
lines changed
src/Illuminate/Http/Resources Expand file tree Collapse file tree 3 files changed +43
-5
lines changed Original file line number Diff line number Diff line change 2
2
3
3
namespace Illuminate \Http \Resources ;
4
4
5
+ use Illuminate \Http \Resources \Json \JsonResource ;
5
6
use Illuminate \Pagination \AbstractCursorPaginator ;
6
7
use Illuminate \Pagination \AbstractPaginator ;
7
8
use Illuminate \Support \Collection ;
8
9
use Illuminate \Support \Str ;
10
+ use LogicException ;
9
11
use ReflectionClass ;
10
12
use Traversable ;
11
13
@@ -45,15 +47,21 @@ protected function collectResource($resource)
45
47
*/
46
48
protected function collects ()
47
49
{
48
- if ($ this ->collects ) {
49
- return $ this ->collects ;
50
- }
50
+ $ collects = null ;
51
51
52
- if (str_ends_with (class_basename ($ this ), 'Collection ' ) &&
52
+ if ($ this ->collects ) {
53
+ $ collects = $ this ->collects ;
54
+ } elseif (str_ends_with (class_basename ($ this ), 'Collection ' ) &&
53
55
(class_exists ($ class = Str::replaceLast ('Collection ' , '' , get_class ($ this ))) ||
54
56
class_exists ($ class = Str::replaceLast ('Collection ' , 'Resource ' , get_class ($ this ))))) {
55
- return $ class ;
57
+ $ collects = $ class ;
56
58
}
59
+
60
+ if (! $ collects || is_subclass_of ($ collects , JsonResource::class)) {
61
+ return $ collects ;
62
+ }
63
+
64
+ throw new LogicException ('Resource collections must collect instances of ' .JsonResource::class.'. ' );
57
65
}
58
66
59
67
/**
Original file line number Diff line number Diff line change
1
+ <?php
2
+
3
+ namespace Illuminate \Tests \Integration \Http \Fixtures ;
4
+
5
+ use Illuminate \Http \Resources \Json \ResourceCollection ;
6
+
7
+ class PostModelCollectionResource extends ResourceCollection
8
+ {
9
+ public $ collects = Post::class;
10
+
11
+ public function toArray ($ request )
12
+ {
13
+ return ['data ' => $ this ->collection ];
14
+ }
15
+ }
Original file line number Diff line number Diff line change 21
21
use Illuminate \Tests \Integration \Http \Fixtures \Post ;
22
22
use Illuminate \Tests \Integration \Http \Fixtures \PostCollectionResource ;
23
23
use Illuminate \Tests \Integration \Http \Fixtures \PostCollectionResourceWithPaginationInformation ;
24
+ use Illuminate \Tests \Integration \Http \Fixtures \PostModelCollectionResource ;
24
25
use Illuminate \Tests \Integration \Http \Fixtures \PostResource ;
25
26
use Illuminate \Tests \Integration \Http \Fixtures \PostResourceWithAnonymousResourceCollectionWithPaginationInformation ;
26
27
use Illuminate \Tests \Integration \Http \Fixtures \PostResourceWithExtraData ;
36
37
use Illuminate \Tests \Integration \Http \Fixtures \ResourceWithPreservedKeys ;
37
38
use Illuminate \Tests \Integration \Http \Fixtures \SerializablePostResource ;
38
39
use Illuminate \Tests \Integration \Http \Fixtures \Subscription ;
40
+ use LogicException ;
39
41
use Mockery ;
40
42
use Orchestra \Testbench \TestCase ;
41
43
@@ -1043,6 +1045,19 @@ public function testCollectionResourcesAreCountable()
1043
1045
$ this ->assertCount (2 , $ collection );
1044
1046
}
1045
1047
1048
+ public function testCollectionResourcesMustCollectResources ()
1049
+ {
1050
+ $ posts = collect ([
1051
+ new Post (['id ' => 1 , 'title ' => 'Test title ' ]),
1052
+ new Post (['id ' => 2 , 'title ' => 'Test title 2 ' ]),
1053
+ ]);
1054
+
1055
+ $ this ->expectException (LogicException::class);
1056
+ $ this ->expectExceptionMessage ('must collect ' );
1057
+
1058
+ new PostModelCollectionResource ($ posts );
1059
+ }
1060
+
1046
1061
public function testKeysArePreservedIfTheResourceIsFlaggedToPreserveKeys ()
1047
1062
{
1048
1063
$ data = [
You can’t perform that action at this time.
0 commit comments