diff --git a/src/Generators/ControllerGenerator.php b/src/Generators/ControllerGenerator.php index 93db889e..94cfa490 100644 --- a/src/Generators/ControllerGenerator.php +++ b/src/Generators/ControllerGenerator.php @@ -183,7 +183,11 @@ protected function buildMethods(Controller $controller) } if (Blueprint::supportsReturnTypeHits()) { - $method = str_replace(')' . PHP_EOL, '): \Illuminate\Http\Response' . PHP_EOL, $method); + if (isset($fqcn) && $name !== 'destroy' && $controller->isApiResource()) { + $method = str_replace(')' . PHP_EOL, '): \\' . $fqcn . PHP_EOL, $method); + } else { + $method = str_replace(')' . PHP_EOL, '): \Illuminate\Http\Response' . PHP_EOL, $method); + } } $methods .= PHP_EOL . $method; diff --git a/tests/Feature/Generators/ControllerGeneratorTest.php b/tests/Feature/Generators/ControllerGeneratorTest.php index 211a25ff..50196992 100644 --- a/tests/Feature/Generators/ControllerGeneratorTest.php +++ b/tests/Feature/Generators/ControllerGeneratorTest.php @@ -195,6 +195,38 @@ public function output_using_return_types() $this->assertEquals(['created' => ['app/Http/Controllers/TermController.php']], $this->subject->output($tree)); } + /** + * @test + * @environment-setup useLaravel8 + */ + public function output_using_return_types_for_api_resource_controller() + { + $this->app['config']->set('blueprint.use_return_types', true); + + $this->filesystem->expects('stub') + ->with('controller.class.stub') + ->andReturn($this->stub('controller.class.stub')); + + $this->filesystem->expects('stub') + ->with('controller.method.stub') + ->andReturn($this->stub('controller.method.stub')); + + $this->filesystem->expects('exists') + ->with('app/Http/Controllers') + ->andReturnFalse(); + + $this->filesystem->expects('makeDirectory') + ->with('app/Http/Controllers', 0755, true); + + $this->filesystem->expects('put') + ->with('app/Http/Controllers/PostController.php', $this->fixture('controllers/return-type-declarations-api-resource.php')); + + $tokens = $this->blueprint->parse($this->fixture('drafts/return-type-declarations-api-controller.yaml')); + $tree = $this->blueprint->analyze($tokens); + + $this->assertEquals(['created' => ['app/Http/Controllers/PostController.php']], $this->subject->output($tree)); + } + public function controllerTreeDataProvider() { return [ diff --git a/tests/fixtures/controllers/return-type-declarations-api-resource.php b/tests/fixtures/controllers/return-type-declarations-api-resource.php new file mode 100644 index 00000000..f50cc70b --- /dev/null +++ b/tests/fixtures/controllers/return-type-declarations-api-resource.php @@ -0,0 +1,69 @@ +validated()); + + return new PostResource($post); + } + + /** + * @param \Illuminate\Http\Request $request + * @param \App\Post $post + * @return \App\Http\Resources\PostResource + */ + public function show(Request $request, Post $post): \App\Http\Resources\PostResource + { + return new PostResource($post); + } + + /** + * @param \App\Http\Requests\PostUpdateRequest $request + * @param \App\Post $post + * @return \App\Http\Resources\PostResource + */ + public function update(PostUpdateRequest $request, Post $post): \App\Http\Resources\PostResource + { + $post->update($request->validated()); + + return new PostResource($post); + } + + /** + * @param \Illuminate\Http\Request $request + * @param \App\Post $post + * @return \Illuminate\Http\Response + */ + public function destroy(Request $request, Post $post): \Illuminate\Http\Response + { + $post->delete(); + + return response()->noContent(); + } +} diff --git a/tests/fixtures/drafts/return-type-declarations-api-controller.yaml b/tests/fixtures/drafts/return-type-declarations-api-controller.yaml new file mode 100644 index 00000000..c8c2cb12 --- /dev/null +++ b/tests/fixtures/drafts/return-type-declarations-api-controller.yaml @@ -0,0 +1,11 @@ +models: + Post: + title: string + body: text +controllers: + Post: + resource: api + index: + query: all + resource: 'paginate:posts' +seeders: Post