Skip to content

Commit cb93d7c

Browse files
Fix resource always generating API routes (#227)
1 parent 3c638a5 commit cb93d7c

File tree

7 files changed

+136
-32
lines changed

7 files changed

+136
-32
lines changed

src/Generators/RouteGenerator.php

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,22 @@ public function output(array $tree): array
2222
return [];
2323
}
2424

25-
$routes = '';
26-
$path = 'routes/web.php';
25+
$routes = ['api' => '', 'web' => ''];
26+
2727
/** @var \Blueprint\Models\Controller $controller */
2828
foreach ($tree['controllers'] as $controller) {
29-
$routes .= PHP_EOL . PHP_EOL . $this->buildRoutes($controller);
30-
31-
if ($controller->isApiResource()) {
32-
$path = 'routes/api.php';
33-
}
29+
$type = $controller->isApiResource() ? 'api' : 'web';
30+
$routes[$type] .= PHP_EOL . PHP_EOL . $this->buildRoutes($controller);
3431
}
35-
$routes .= PHP_EOL;
3632

37-
$this->files->append($path, $routes);
33+
$paths = [];
34+
foreach (array_filter($routes) as $type => $definitions) {
35+
$path = 'routes/' . $type . '.php';
36+
$this->files->append($path, $definitions . PHP_EOL);
37+
$paths[] = $path;
38+
}
3839

39-
return ['updated' => [$path]];
40+
return ['updated' => $paths];
4041
}
4142

4243
protected function buildRoutes(Controller $controller)

src/Lexers/ControllerLexer.php

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,16 @@ public function analyze(array $tokens): array
2929
foreach ($tokens['controllers'] as $name => $definition) {
3030
$controller = new Controller($name);
3131

32-
if ($this->isResource($definition)) {
33-
$original = $definition;
34-
$definition = $this->generateResourceTokens($controller, $this->methodsForResource($definition['resource']));
35-
// unset shorthand
36-
unset($original['resource']);
37-
// this gives the ability to both use a shorthand and override some methods
38-
$definition = array_merge($definition, $original);
39-
$controller->setApiResource(true);
32+
if (isset($definition['resource'])) {
33+
$resource_definition = $this->generateResourceTokens($controller, $this->methodsForResource($definition['resource']));
34+
35+
if ($definition['resource'] === 'api') {
36+
$controller->setApiResource(true);
37+
}
38+
39+
unset($definition['resource']);
40+
41+
$definition = array_merge($resource_definition, $definition);
4042
}
4143

4244
foreach ($definition as $method => $body) {
@@ -49,11 +51,6 @@ public function analyze(array $tokens): array
4951
return $registry;
5052
}
5153

52-
private function isResource(array $definition)
53-
{
54-
return isset($definition['resource']) && is_string($definition['resource']);
55-
}
56-
5754
private function generateResourceTokens(Controller $controller, array $methods)
5855
{
5956
return collect($this->resourceTokens())

tests/Feature/Generator/RouteGeneratorTest.php

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ protected function setUp(): void
3434
/**
3535
* @test
3636
*/
37-
public function output_writes_nothing_for_empty_tree()
37+
public function output_generates_nothing_for_empty_tree()
3838
{
3939
$this->files->shouldNotHaveReceived('append');
4040

@@ -45,7 +45,7 @@ public function output_writes_nothing_for_empty_tree()
4545
* @test
4646
* @dataProvider controllerTreeDataProvider
4747
*/
48-
public function output_writes_migration_for_route_tree($definition, $routes)
48+
public function output_generates_web_routes($definition, $routes)
4949
{
5050
$path = 'routes/web.php';
5151
$this->files->expects('append')
@@ -60,19 +60,31 @@ public function output_writes_migration_for_route_tree($definition, $routes)
6060
/**
6161
* @test
6262
*/
63-
public function output_writes_migration_for_route_tree_api_routes()
63+
public function output_generates_api_routes()
6464
{
65-
$definition = "definitions/api-routes-example.bp";
66-
$routes = "routes/api-routes.php";
67-
$path = 'routes/api.php';
65+
$this->files->expects('append')
66+
->with('routes/api.php', $this->fixture('routes/api-routes.php'));
67+
68+
$tokens = $this->blueprint->parse($this->fixture('definitions/api-routes-example.bp'));
69+
$tree = $this->blueprint->analyze($tokens);
6870

71+
$this->assertEquals(['updated' => ['routes/api.php']], $this->subject->output($tree));
72+
}
73+
74+
/**
75+
* @test
76+
*/
77+
public function output_generates_routes_for_mixed_resources()
78+
{
6979
$this->files->expects('append')
70-
->with($path, $this->fixture($routes));
80+
->with('routes/api.php', $this->fixture('routes/multiple-resource-controllers-api.php'));
81+
$this->files->expects('append')
82+
->with('routes/web.php', $this->fixture('routes/multiple-resource-controllers-web.php'));
7183

72-
$tokens = $this->blueprint->parse($this->fixture($definition));
84+
$tokens = $this->blueprint->parse($this->fixture('definitions/multiple-resource-controllers.bp'));
7385
$tree = $this->blueprint->analyze($tokens);
7486

75-
$this->assertEquals(['updated' => [$path]], $this->subject->output($tree));
87+
$this->assertEquals(['updated' => ['routes/api.php', 'routes/web.php']], $this->subject->output($tree));
7688
}
7789

7890
public function controllerTreeDataProvider()

tests/Feature/Lexers/ControllerLexerTest.php

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,4 +380,53 @@ public function it_returns_a_resource_controller_with_overrides()
380380
$this->assertCount(1, $methods['custom']);
381381
$this->assertEquals('custom-statements', $methods['custom'][0]);
382382
}
383+
384+
/**
385+
* @test
386+
*/
387+
public function it_returns_a_resource_controllers_with_api_flag_set()
388+
{
389+
$tokens = [
390+
'controllers' => [
391+
'Page' => [
392+
'resource' => 'web',
393+
],
394+
'File' => [
395+
'resource' => 'api',
396+
],
397+
'Category' => [
398+
'resource' => 'web',
399+
],
400+
'Gallery' => [
401+
'resource' => 'api',
402+
],
403+
]
404+
];
405+
406+
$this->statementLexer->shouldReceive('analyze');
407+
408+
$actual = $this->subject->analyze($tokens);
409+
410+
$this->assertCount(4, $actual['controllers']);
411+
412+
$controller = $actual['controllers']['Page'];
413+
$this->assertEquals('PageController', $controller->className());
414+
$this->assertCount(7, $controller->methods());
415+
$this->assertFalse($controller->isApiResource());
416+
417+
$controller = $actual['controllers']['File'];
418+
$this->assertEquals('FileController', $controller->className());
419+
$this->assertCount(5, $controller->methods());
420+
$this->assertTrue($controller->isApiResource());
421+
422+
$controller = $actual['controllers']['Category'];
423+
$this->assertEquals('CategoryController', $controller->className());
424+
$this->assertCount(7, $controller->methods());
425+
$this->assertFalse($controller->isApiResource());
426+
427+
$controller = $actual['controllers']['Gallery'];
428+
$this->assertEquals('GalleryController', $controller->className());
429+
$this->assertCount(5, $controller->methods());
430+
$this->assertTrue($controller->isApiResource());
431+
}
383432
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
models:
2+
Page:
3+
page_name: string
4+
page_slug: string
5+
page_content: longtext
6+
order: integer nullable
7+
8+
File:
9+
file_name: string
10+
file_path: text
11+
relationships:
12+
belongsToMany: Category
13+
14+
Category:
15+
category_name: string
16+
relationships:
17+
belongsToMany: File
18+
19+
Gallery:
20+
gallery_name: string
21+
images: longtext
22+
order: integer nullable
23+
24+
controllers:
25+
Page:
26+
resource
27+
28+
File:
29+
resource: api
30+
31+
Category:
32+
resource
33+
34+
Gallery:
35+
resource: api
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
3+
Route::apiResource('file', 'FileController');
4+
5+
Route::apiResource('gallery', 'GalleryController');
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
3+
Route::resource('page', 'PageController');
4+
5+
Route::resource('category', 'CategoryController');

0 commit comments

Comments
 (0)