diff --git a/src/Illuminate/Http/Resources/CollectsResources.php b/src/Illuminate/Http/Resources/CollectsResources.php index 1333c27fea8c..a5531f7a02ce 100644 --- a/src/Illuminate/Http/Resources/CollectsResources.php +++ b/src/Illuminate/Http/Resources/CollectsResources.php @@ -3,6 +3,7 @@ namespace Illuminate\Http\Resources; use Illuminate\Pagination\AbstractPaginator; +use Illuminate\Support\Collection; use Illuminate\Support\Str; trait CollectsResources @@ -19,6 +20,10 @@ protected function collectResource($resource) return $resource; } + if (is_array($resource)) { + $resource = new Collection($resource); + } + $collects = $this->collects(); $this->collection = $collects && ! $resource->first() instanceof $collects diff --git a/tests/Integration/Http/Fixtures/ObjectResource.php b/tests/Integration/Http/Fixtures/ObjectResource.php new file mode 100644 index 000000000000..c89b0b4678bf --- /dev/null +++ b/tests/Integration/Http/Fixtures/ObjectResource.php @@ -0,0 +1,16 @@ + $this->first_name, + 'age' => $this->age, + ]; + } +} diff --git a/tests/Integration/Http/ResourceTest.php b/tests/Integration/Http/ResourceTest.php index 8136c6d7eb07..c9332ac63d5f 100644 --- a/tests/Integration/Http/ResourceTest.php +++ b/tests/Integration/Http/ResourceTest.php @@ -12,6 +12,7 @@ use Illuminate\Tests\Integration\Http\Fixtures\Author; use Illuminate\Tests\Integration\Http\Fixtures\AuthorResourceWithOptionalRelationship; use Illuminate\Tests\Integration\Http\Fixtures\EmptyPostCollectionResource; +use Illuminate\Tests\Integration\Http\Fixtures\ObjectResource; use Illuminate\Tests\Integration\Http\Fixtures\Post; use Illuminate\Tests\Integration\Http\Fixtures\PostCollectionResource; use Illuminate\Tests\Integration\Http\Fixtures\PostResource; @@ -55,6 +56,47 @@ public function testResourcesMayBeConvertedToJson() ]); } + public function testAnObjectsMayBeConvertedToJson() + { + Route::get('/', function () { + return ObjectResource::make( + (object) ['first_name' => 'Bob', 'age' => 40] + ); + }); + + $this->withoutExceptionHandling() + ->get('/', ['Accept' => 'application/json']) + ->assertStatus(200) + ->assertExactJson([ + 'data' => [ + 'name' => 'Bob', + 'age' => 40, + ], + ]); + } + + public function testArraysWithObjectsMayBeConvertedToJson() + { + Route::get('/', function () { + $objects = [ + (object) ['first_name' => 'Bob', 'age' => 40], + (object) ['first_name' => 'Jack', 'age' => 25], + ]; + + return ObjectResource::collection($objects); + }); + + $this->withoutExceptionHandling() + ->get('/', ['Accept' => 'application/json']) + ->assertStatus(200) + ->assertExactJson([ + 'data' => [ + ['name' => 'Bob', 'age' => 40], + ['name' => 'Jack', 'age' => 25], + ], + ]); + } + public function testResourcesMayHaveNoWrap() { Route::get('/', function () {