Skip to content

Commit 6335c94

Browse files
authored
Add support for namespaced JsonResources (#330)
1 parent e591799 commit 6335c94

File tree

8 files changed

+165
-6
lines changed

8 files changed

+165
-6
lines changed

src/Generators/Statements/ResourceGenerator.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public function output(Tree $tree): array
4242
continue;
4343
}
4444

45-
$path = $this->getPath($statement->name());
45+
$path = $this->getPath(($controller->namespace() ? $controller->namespace().'/' : '').$statement->name());
4646

4747
if ($this->files->exists($path)) {
4848
continue;
@@ -52,7 +52,7 @@ public function output(Tree $tree): array
5252
$this->files->makeDirectory(dirname($path), 0755, true);
5353
}
5454

55-
$this->files->put($path, $this->populateStub($stub, $statement));
55+
$this->files->put($path, $this->populateStub($stub, $controller, $statement));
5656

5757
$output['created'][] = $path;
5858
}
@@ -72,9 +72,13 @@ protected function getPath(string $name)
7272
return Blueprint::appPath().'/Http/Resources/'.$name.'.php';
7373
}
7474

75-
protected function populateStub(string $stub, ResourceStatement $resource)
75+
protected function populateStub(string $stub, Controller $controller, ResourceStatement $resource)
7676
{
77-
$stub = str_replace('{{ namespace }}', config('blueprint.namespace').'\\Http\\Resources', $stub);
77+
$namespace = config('blueprint.namespace')
78+
.'\\Http\\Resources'
79+
.($controller->namespace() ? '\\'.$controller->namespace() : '');
80+
81+
$stub = str_replace('{{ namespace }}', $namespace, $stub);
7882
$stub = str_replace('{{ import }}', $resource->collection() ? 'Illuminate\\Http\\Resources\\Json\\ResourceCollection' : 'Illuminate\\Http\\Resources\\Json\\JsonResource', $stub);
7983
$stub = str_replace('{{ parentClass }}', $resource->collection() ? 'ResourceCollection' : 'JsonResource', $stub);
8084
$stub = str_replace('{{ class }}', $resource->name(), $stub);

tests/Feature/Generator/ControllerGeneratorTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ public function controllerTreeDataProvider()
175175
['drafts/respond-statements.yaml', 'app/Http/Controllers/Api/PostController.php', 'controllers/respond-statements.php'],
176176
['drafts/resource-statements.yaml', 'app/Http/Controllers/UserController.php', 'controllers/resource-statements.php'],
177177
['drafts/save-without-validation.yaml', 'app/Http/Controllers/PostController.php', 'controllers/save-without-validation.php'],
178+
['drafts/api-routes-example.yaml', 'app/Http/Controllers/Api/CertificateController.php', 'controllers/api-routes-example.php'],
178179
];
179180
}
180181
}

tests/Feature/Generator/Statements/ResourceGeneratorTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,40 @@ public function output_writes_resources_for_render_statements()
100100

101101
$this->assertEquals(['created' => ['app/Http/Resources/UserCollection.php', 'app/Http/Resources/User.php']], $this->subject->output($tree));
102102
}
103+
104+
/**
105+
* @test
106+
*/
107+
public function output_writes_namespaced_classes()
108+
{
109+
$this->files->expects('stub')
110+
->with('resource.stub')
111+
->andReturn(file_get_contents('stubs/resource.stub'));
112+
113+
$this->files->shouldReceive('exists')
114+
->with('app/Http/Resources/Api')
115+
->andReturns(false, true);
116+
$this->files->expects('makeDirectory')
117+
->with('app/Http/Resources/Api', 0755, true);
118+
119+
$this->files->expects('exists')
120+
->times(3)
121+
->with('app/Http/Resources/Api/Certificate.php')
122+
->andReturns(false, true, true);
123+
$this->files->expects('put')
124+
->with('app/Http/Resources/Api/Certificate.php', $this->fixture('resources/certificate.php'));
125+
126+
$this->files->expects('exists')
127+
->with('app/Http/Resources/Api/CertificateCollection.php')
128+
->andReturns(false);
129+
$this->files->expects('put')
130+
->with('app/Http/Resources/Api/CertificateCollection.php', $this->fixture('resources/certificate-collection.php'));
131+
132+
$tokens = $this->blueprint->parse($this->fixture('drafts/api-routes-example.yaml'));
133+
$tree = $this->blueprint->analyze($tokens);
134+
135+
$this->assertEquals([
136+
'created' => ['app/Http/Resources/Api/CertificateCollection.php', 'app/Http/Resources/Api/Certificate.php'],
137+
], $this->subject->output($tree));
138+
}
103139
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Api;
4+
5+
use App\Certificate;
6+
use App\Http\Controllers\Controller;
7+
use App\Http\Requests\Api\CertificateStoreRequest;
8+
use App\Http\Requests\Api\CertificateUpdateRequest;
9+
use App\Http\Resources\Api\Certificate as CertificateResource;
10+
use App\Http\Resources\Api\CertificateCollection;
11+
use Illuminate\Http\Request;
12+
13+
class CertificateController extends Controller
14+
{
15+
/**
16+
* @param \Illuminate\Http\Request $request
17+
* @return \App\Http\Resources\Api\CertificateCollection
18+
*/
19+
public function index(Request $request)
20+
{
21+
$certificates = Certificate::all();
22+
23+
return new CertificateCollection($certificates);
24+
}
25+
26+
/**
27+
* @param \App\Http\Requests\Api\CertificateStoreRequest $request
28+
* @return \App\Http\Resources\Api\Certificate
29+
*/
30+
public function store(CertificateStoreRequest $request)
31+
{
32+
$certificate = Certificate::create($request->validated());
33+
34+
return new CertificateResource($certificate);
35+
}
36+
37+
/**
38+
* @param \Illuminate\Http\Request $request
39+
* @param \App\Certificate $certificate
40+
* @return \App\Http\Resources\Api\Certificate
41+
*/
42+
public function show(Request $request, Certificate $certificate)
43+
{
44+
return new CertificateResource($certificate);
45+
}
46+
47+
/**
48+
* @param \App\Http\Requests\Api\CertificateUpdateRequest $request
49+
* @param \App\Certificate $certificate
50+
* @return \App\Http\Resources\Api\Certificate
51+
*/
52+
public function update(CertificateUpdateRequest $request, Certificate $certificate)
53+
{
54+
$certificate->update($request->validated());
55+
56+
return new CertificateResource($certificate);
57+
}
58+
59+
/**
60+
* @param \Illuminate\Http\Request $request
61+
* @param \App\Certificate $certificate
62+
* @return \Illuminate\Http\Response
63+
*/
64+
public function destroy(Request $request, Certificate $certificate)
65+
{
66+
$certificate->delete();
67+
68+
return response()->noContent(200);
69+
}
70+
}

tests/fixtures/drafts/api-routes-example.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ models:
88
remarks: text nullable
99

1010
controllers:
11-
Certificate:
11+
Api/Certificate:
1212
resource: api
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace App\Http\Resources\Api;
4+
5+
use Illuminate\Http\Resources\Json\ResourceCollection;
6+
7+
class CertificateCollection extends ResourceCollection
8+
{
9+
/**
10+
* Transform the resource collection into an array.
11+
*
12+
* @param \Illuminate\Http\Request $request
13+
* @return array
14+
*/
15+
public function toArray($request)
16+
{
17+
return [
18+
'data' => $this->collection,
19+
];
20+
}
21+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace App\Http\Resources\Api;
4+
5+
use Illuminate\Http\Resources\Json\JsonResource;
6+
7+
class Certificate extends JsonResource
8+
{
9+
/**
10+
* Transform the resource into an array.
11+
*
12+
* @param \Illuminate\Http\Request $request
13+
* @return array
14+
*/
15+
public function toArray($request)
16+
{
17+
return [
18+
'id' => $this->id,
19+
'name' => $this->name,
20+
'certificate_type_id' => $this->certificate_type_id,
21+
'reference' => $this->reference,
22+
'document' => $this->document,
23+
'expiry_date' => $this->expiry_date,
24+
'remarks' => $this->remarks,
25+
];
26+
}
27+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11

22

3-
Route::apiResource('certificate', 'CertificateController');
3+
Route::apiResource('certificate', 'Api\CertificateController');

0 commit comments

Comments
 (0)