Skip to content

Commit c729183

Browse files
authored
Set return types in DocBlock when using resources (#494)
1 parent 9e8bd03 commit c729183

File tree

4 files changed

+117
-1
lines changed

4 files changed

+117
-1
lines changed

src/Generators/ControllerGenerator.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,11 @@ protected function buildMethods(Controller $controller)
183183
}
184184

185185
if (Blueprint::supportsReturnTypeHits()) {
186-
$method = str_replace(')' . PHP_EOL, '): \Illuminate\Http\Response' . PHP_EOL, $method);
186+
if (isset($fqcn) && $name !== 'destroy' && $controller->isApiResource()) {
187+
$method = str_replace(')' . PHP_EOL, '): \\' . $fqcn . PHP_EOL, $method);
188+
} else {
189+
$method = str_replace(')' . PHP_EOL, '): \Illuminate\Http\Response' . PHP_EOL, $method);
190+
}
187191
}
188192

189193
$methods .= PHP_EOL . $method;

tests/Feature/Generators/ControllerGeneratorTest.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,38 @@ public function output_using_return_types()
195195
$this->assertEquals(['created' => ['app/Http/Controllers/TermController.php']], $this->subject->output($tree));
196196
}
197197

198+
/**
199+
* @test
200+
* @environment-setup useLaravel8
201+
*/
202+
public function output_using_return_types_for_api_resource_controller()
203+
{
204+
$this->app['config']->set('blueprint.use_return_types', true);
205+
206+
$this->filesystem->expects('stub')
207+
->with('controller.class.stub')
208+
->andReturn($this->stub('controller.class.stub'));
209+
210+
$this->filesystem->expects('stub')
211+
->with('controller.method.stub')
212+
->andReturn($this->stub('controller.method.stub'));
213+
214+
$this->filesystem->expects('exists')
215+
->with('app/Http/Controllers')
216+
->andReturnFalse();
217+
218+
$this->filesystem->expects('makeDirectory')
219+
->with('app/Http/Controllers', 0755, true);
220+
221+
$this->filesystem->expects('put')
222+
->with('app/Http/Controllers/PostController.php', $this->fixture('controllers/return-type-declarations-api-resource.php'));
223+
224+
$tokens = $this->blueprint->parse($this->fixture('drafts/return-type-declarations-api-controller.yaml'));
225+
$tree = $this->blueprint->analyze($tokens);
226+
227+
$this->assertEquals(['created' => ['app/Http/Controllers/PostController.php']], $this->subject->output($tree));
228+
}
229+
198230
public function controllerTreeDataProvider()
199231
{
200232
return [
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<?php
2+
3+
namespace App\Http\Controllers;
4+
5+
use App\Http\Requests\PostStoreRequest;
6+
use App\Http\Requests\PostUpdateRequest;
7+
use App\Http\Resources\PostCollection;
8+
use App\Http\Resources\PostResource;
9+
use App\Post;
10+
use Illuminate\Http\Request;
11+
12+
class PostController extends Controller
13+
{
14+
/**
15+
* @param \Illuminate\Http\Request $request
16+
* @return \App\Http\Resources\PostCollection
17+
*/
18+
public function index(Request $request): \App\Http\Resources\PostCollection
19+
{
20+
$posts = Post::paginate();
21+
22+
return new PostCollection($posts);
23+
}
24+
25+
/**
26+
* @param \App\Http\Requests\PostStoreRequest $request
27+
* @return \App\Http\Resources\PostResource
28+
*/
29+
public function store(PostStoreRequest $request): \App\Http\Resources\PostResource
30+
{
31+
$post = Post::create($request->validated());
32+
33+
return new PostResource($post);
34+
}
35+
36+
/**
37+
* @param \Illuminate\Http\Request $request
38+
* @param \App\Post $post
39+
* @return \App\Http\Resources\PostResource
40+
*/
41+
public function show(Request $request, Post $post): \App\Http\Resources\PostResource
42+
{
43+
return new PostResource($post);
44+
}
45+
46+
/**
47+
* @param \App\Http\Requests\PostUpdateRequest $request
48+
* @param \App\Post $post
49+
* @return \App\Http\Resources\PostResource
50+
*/
51+
public function update(PostUpdateRequest $request, Post $post): \App\Http\Resources\PostResource
52+
{
53+
$post->update($request->validated());
54+
55+
return new PostResource($post);
56+
}
57+
58+
/**
59+
* @param \Illuminate\Http\Request $request
60+
* @param \App\Post $post
61+
* @return \Illuminate\Http\Response
62+
*/
63+
public function destroy(Request $request, Post $post): \Illuminate\Http\Response
64+
{
65+
$post->delete();
66+
67+
return response()->noContent();
68+
}
69+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
models:
2+
Post:
3+
title: string
4+
body: text
5+
controllers:
6+
Post:
7+
resource: api
8+
index:
9+
query: all
10+
resource: 'paginate:posts'
11+
seeders: Post

0 commit comments

Comments
 (0)