diff --git a/src/Illuminate/Http/Resources/CollectsResources.php b/src/Illuminate/Http/Resources/CollectsResources.php index 77269042aba3..a4d4faba2713 100644 --- a/src/Illuminate/Http/Resources/CollectsResources.php +++ b/src/Illuminate/Http/Resources/CollectsResources.php @@ -6,6 +6,7 @@ use Illuminate\Pagination\AbstractPaginator; use Illuminate\Support\Collection; use Illuminate\Support\Str; +use ReflectionClass; trait CollectsResources { @@ -63,7 +64,13 @@ public function jsonOptions() { $collects = $this->collects(); - return $collects ? (new $collects([]))->jsonOptions() : 0; + if (! $collects) { + return 0; + } + + return (new ReflectionClass($collects)) + ->newInstanceWithoutConstructor() + ->jsonOptions(); } /** diff --git a/tests/Integration/Http/Fixtures/PostResourceWithJsonOptionsAndTypeHints.php b/tests/Integration/Http/Fixtures/PostResourceWithJsonOptionsAndTypeHints.php new file mode 100644 index 000000000000..834af06c8bf2 --- /dev/null +++ b/tests/Integration/Http/Fixtures/PostResourceWithJsonOptionsAndTypeHints.php @@ -0,0 +1,27 @@ + $this->id, + 'title' => $this->title, + 'reading_time' => $this->reading_time, + ]; + } + + public function jsonOptions() + { + return JSON_PRESERVE_ZERO_FRACTION; + } +} diff --git a/tests/Integration/Http/ResourceTest.php b/tests/Integration/Http/ResourceTest.php index 3d339e229677..94eff8839383 100644 --- a/tests/Integration/Http/ResourceTest.php +++ b/tests/Integration/Http/ResourceTest.php @@ -25,6 +25,7 @@ use Illuminate\Tests\Integration\Http\Fixtures\PostResourceWithAnonymousResourceCollectionWithPaginationInformation; use Illuminate\Tests\Integration\Http\Fixtures\PostResourceWithExtraData; use Illuminate\Tests\Integration\Http\Fixtures\PostResourceWithJsonOptions; +use Illuminate\Tests\Integration\Http\Fixtures\PostResourceWithJsonOptionsAndTypeHints; use Illuminate\Tests\Integration\Http\Fixtures\PostResourceWithOptionalAppendedAttributes; use Illuminate\Tests\Integration\Http\Fixtures\PostResourceWithOptionalData; use Illuminate\Tests\Integration\Http\Fixtures\PostResourceWithOptionalMerging; @@ -555,6 +556,26 @@ public function testResourcesMayCustomizeJsonOptionsOnPaginatedResponse() ); } + public function testResourcesMayCustomizeJsonOptionsWithTypeHintedConstructor() + { + Route::get('/', function () { + return new PostResourceWithJsonOptionsAndTypeHints(new Post([ + 'id' => 5, + 'title' => 'Test Title', + 'reading_time' => 3.0, + ])); + }); + + $response = $this->withoutExceptionHandling()->get( + '/', ['Accept' => 'application/json'] + ); + + $this->assertEquals( + '{"data":{"id":5,"title":"Test Title","reading_time":3.0}}', + $response->baseResponse->content() + ); + } + public function testCustomHeadersMayBeSetOnResponses() { Route::get('/', function () {