Skip to content

Commit 89bbc4c

Browse files
committed
Honor resourceful controller method contexts
1 parent 0c28a69 commit 89bbc4c

File tree

7 files changed

+41
-24
lines changed

7 files changed

+41
-24
lines changed

src/Generators/ControllerGenerator.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,19 @@ private function buildMethods(Controller $controller)
6969
foreach ($controller->methods() as $name => $statements) {
7070
$method = str_replace('DummyMethod', $name, $template);
7171

72-
// TODO: if resourceful action, do implicit model binding
72+
if (in_array($name, ['edit', 'update', 'show', 'destroy'])) {
73+
$context = Str::singular($controller->prefix());
74+
$reference = 'App\\' . $context;
75+
$variable = '$' . Str::camel($context);
76+
77+
// TODO: verify is model
78+
$search = ' * @return \\Illuminate\\Http\\Response';
79+
$method = str_replace($search,' * @param \\' . $reference . ' ' . $variable . PHP_EOL . $search, $method);
80+
81+
$search = '(Request $request';
82+
$method = str_replace($search, $search . ', ' . $context . ' ' . $variable, $method);
83+
$this->addImport($controller, $reference);
84+
}
7385

7486
$body = '';
7587
foreach ($statements as $statement) {
@@ -81,7 +93,7 @@ private function buildMethods(Controller $controller)
8193
$class = $controller->name() . Str::studly($name) . 'Request';
8294

8395
$method = str_replace('\Illuminate\Http\Request $request', '\\App\\Http\\Requests\\' . $class . ' $request', $method);
84-
$method = str_replace('(Request $request)', '(' . $class . ' $request)', $method);
96+
$method = str_replace('(Request $request', '(' . $class . ' $request', $method);
8597

8698
$this->addImport($controller, 'App\\Http\\Requests\\' . $class);
8799
} elseif ($statement instanceof DispatchStatement) {
@@ -100,7 +112,7 @@ private function buildMethods(Controller $controller)
100112
$body .= self::INDENT . $statement->output() . PHP_EOL;
101113
} elseif ($statement instanceof EloquentStatement) {
102114
// TODO: pass controller method for context..
103-
$body .= self::INDENT . $statement->output() . PHP_EOL;
115+
$body .= self::INDENT . $statement->output($name) . PHP_EOL;
104116
$this->addImport($controller, 'App\\' . Str::studly($statement->reference()));
105117
} elseif ($statement instanceof QueryStatement) {
106118
$body .= self::INDENT . $statement->output() . PHP_EOL;

src/Generators/RouteGenerator.php

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ class RouteGenerator implements Generator
1111
/** @var \Illuminate\Contracts\Filesystem\Filesystem */
1212
private $files;
1313

14-
private $resourceMethods = ['index', 'create', 'store', 'edit', 'update', 'show', 'destroy'];
15-
1614
public function __construct($files)
1715
{
1816
$this->files = $files;
@@ -45,11 +43,11 @@ protected function buildRoutes(Controller $controller)
4543
$className = $controller->className();
4644
$slug = Str::kebab($controller->prefix());
4745

48-
$resource_methods = array_intersect($methods, $this->resourceMethods);
46+
$resource_methods = array_intersect($methods, Controller::$resourceMethods);
4947
if (count($resource_methods)) {
5048
$routes .= sprintf("Route::resource('%s', '%s')", $slug, $className);
5149

52-
$missing_methods = array_diff($this->resourceMethods, $resource_methods);
50+
$missing_methods = array_diff(Controller::$resourceMethods, $resource_methods);
5351
if (count($missing_methods)) {
5452
if (count($missing_methods) < 4) {
5553
$routes .= sprintf("->except('%s')", implode("', '", $missing_methods));
@@ -62,7 +60,7 @@ protected function buildRoutes(Controller $controller)
6260
$routes .= ';' . PHP_EOL;
6361
}
6462

65-
$methods = array_diff($methods, $this->resourceMethods);
63+
$methods = array_diff($methods, Controller::$resourceMethods);
6664
foreach ($methods as $method) {
6765
$routes .= sprintf("Route::get('%s/%s', '%s@%s');", $slug, Str::kebab($method), $className, $method);
6866
$routes .= PHP_EOL;

src/Models/Controller.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
class Controller
1010
{
11+
/** @var array */
12+
public static $resourceMethods = ['index', 'create', 'store', 'edit', 'update', 'show', 'destroy'];
13+
1114
/**
1215
* @var string
1316
*/

src/Models/Statements/EloquentStatement.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,17 @@ public function reference(): string
3434
return $this->reference;
3535
}
3636

37-
public function output()
37+
public function output(string $context)
3838
{
3939
if ($this->operation() == 'save') {
40-
$code = "$" . Str::lower(Str::singular($this->reference()));
41-
$code .= ' = ';
42-
$code .= Str::studly($this->reference());
43-
$code .= '::create($request->all());';
40+
if ($context === 'store') {
41+
$code = "$" . Str::lower(Str::singular($this->reference()));
42+
$code .= ' = ';
43+
$code .= Str::studly($this->reference());
44+
$code .= '::create($request->all());';
45+
} else {
46+
$code = "$" . Str::lower(Str::singular($this->reference())) . '->save();';
47+
}
4448
}
4549

4650
if ($this->operation() == 'find') {

stubs/controller/method.stub

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* @param \Illuminate\Http\Request $request
2+
* @param \Illuminate\Http\Request $request
33
* @return \Illuminate\Http\Response
44
*/
55
public function DummyMethod(Request $request)

tests/fixtures/controllers/crazy-eloquent.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
class PostController extends Controller
99
{
1010
/**
11-
* @param \Illuminate\Http\Request $request
11+
* @param \Illuminate\Http\Request $request
1212
* @return \Illuminate\Http\Response
1313
*/
1414
public function index(Request $request)
@@ -19,8 +19,8 @@ public function index(Request $request)
1919
}
2020

2121
/**
22-
* @param \Illuminate\Http\Request $request
23-
* @param \App\Post $post
22+
* @param \Illuminate\Http\Request $request
23+
* @param \App\Post $post
2424
* @return \Illuminate\Http\Response
2525
*/
2626
public function edit(Request $request, Post $post)
@@ -31,18 +31,18 @@ public function edit(Request $request, Post $post)
3131
}
3232

3333
/**
34-
* @param \Illuminate\Http\Request $request
35-
* @param \App\Post $post
34+
* @param \Illuminate\Http\Request $request
35+
* @param \App\Post $post
3636
* @return \Illuminate\Http\Response
3737
*/
3838
public function update(Request $request, Post $post)
3939
{
40-
$post = Post::find($id);
40+
$post = Post::find($post->id);
4141

42-
$post_ids = Post::where('title', $title)->take(3)->pluck('id');
42+
$post_ids = Post::where('title', $post->title)->take(3)->pluck('id');
4343

4444
$post->save();
4545

46-
return redirect()->route('post.edit', $id);
46+
return redirect()->route('post.edit', $post->id);
4747
}
4848
}

tests/fixtures/controllers/readme-example.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
class PostController extends Controller
1414
{
1515
/**
16-
* @param \Illuminate\Http\Request $request
16+
* @param \Illuminate\Http\Request $request
1717
* @return \Illuminate\Http\Response
1818
*/
1919
public function index(Request $request)
@@ -24,7 +24,7 @@ public function index(Request $request)
2424
}
2525

2626
/**
27-
* @param \App\Http\Requests\PostStoreRequest $request
27+
* @param \App\Http\Requests\PostStoreRequest $request
2828
* @return \Illuminate\Http\Response
2929
*/
3030
public function store(PostStoreRequest $request)

0 commit comments

Comments
 (0)