From 90daf5faf209421cb52dd8d8537f8be79c892de3 Mon Sep 17 00:00:00 2001 From: Yannik Firre <3316758+YannikFirre@users.noreply.github.com> Date: Tue, 10 Aug 2021 16:38:44 +0200 Subject: [PATCH 1/4] FIX - return types in controller when use resource: api --- src/Generators/ControllerGenerator.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Generators/ControllerGenerator.php b/src/Generators/ControllerGenerator.php index 93db889e..20d46d65 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($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; From fbb24a5ecb24184b7bf8cb13818dc3b00265e84c Mon Sep 17 00:00:00 2001 From: Yannik Firre <3316758+YannikFirre@users.noreply.github.com> Date: Tue, 10 Aug 2021 19:35:19 +0200 Subject: [PATCH 2/4] Update ControllerGenerator.php --- src/Generators/ControllerGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Generators/ControllerGenerator.php b/src/Generators/ControllerGenerator.php index 20d46d65..d1021cc8 100644 --- a/src/Generators/ControllerGenerator.php +++ b/src/Generators/ControllerGenerator.php @@ -183,7 +183,7 @@ protected function buildMethods(Controller $controller) } if (Blueprint::supportsReturnTypeHits()) { - if($controller->isApiResource()) { + if ($controller->isApiResource()) { $method = str_replace(')' . PHP_EOL, '): \\' . $fqcn . PHP_EOL, $method); } else { $method = str_replace(')' . PHP_EOL, '): \Illuminate\Http\Response' . PHP_EOL, $method); From df719d32a03d4ec5126fc63da18272981c76a43e Mon Sep 17 00:00:00 2001 From: Yannik Firre <> Date: Wed, 11 Aug 2021 14:04:57 +0200 Subject: [PATCH 3/4] FIXED - destroy method not return resource --- src/Generators/ControllerGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Generators/ControllerGenerator.php b/src/Generators/ControllerGenerator.php index d1021cc8..94cfa490 100644 --- a/src/Generators/ControllerGenerator.php +++ b/src/Generators/ControllerGenerator.php @@ -183,7 +183,7 @@ protected function buildMethods(Controller $controller) } if (Blueprint::supportsReturnTypeHits()) { - if ($controller->isApiResource()) { + 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); From 20c4ca9089dfd4c90fa5b17db099679ffa77659d Mon Sep 17 00:00:00 2001 From: Yannik Firre <> Date: Wed, 11 Aug 2021 14:05:07 +0200 Subject: [PATCH 4/4] ADDE - test --- .../Generators/ControllerGeneratorTest.php | 32 +++++++++ .../return-type-declarations-api-resource.php | 69 +++++++++++++++++++ ...turn-type-declarations-api-controller.yaml | 11 +++ 3 files changed, 112 insertions(+) create mode 100644 tests/fixtures/controllers/return-type-declarations-api-resource.php create mode 100644 tests/fixtures/drafts/return-type-declarations-api-controller.yaml 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