Laravel知れば知るほど便利度と自由度の高さには驚かされます。
Railsに似ていることもあり、採用するサービスや使っている人もどんどん増えているみたいですね。
そんな中でLaravelのシングルアクションコントローラーという概念があります。
今回は、そのコントローラーを作成する際 Invalid route action
というエラーに少し詰まったので備忘録として残します。
シングルアクションコントローラーとは
その名の通りアクションが1つだけのコントローラーです。
Laravelの場合、シングルアクションコントローラーにはコントローラーの中にinvokeメソッドだけが存在しています。
この話のようにできるだけコントローラーはシンプルにしたいものですよね。
1つのアクションが存在しているだけのコントローラーなんか通常通りにコントローラーを作成してメソッドを1つだけ作ればいいのではないか?という話もありますが、 明示的に単一のアクションがある方が可読性が上がるのかな?と思います。(その他のメリットはまだ勉強中です…)
アクションが作成されない
Laravelの公式ページ
https://readouble.com/laravel/5.7/ja
さて本題に入りますが今回、上記の公式ページ通りにシングルアクションコントローラーを作成しました。
ルーティングを公式ページ通り下記のように設定します。
Route::get('user/{id}', 'ShowProfile');
そして対応するコントローラーを作成するコマンド。
php artisan make:controller ShowProfile --invokable
とすると下記エラーが発生。
Invalid route action: [App\Http\Controllers\ShowProfile].
ルーティングがだめだとのことでした。
stackoverflow なんかを見てみるとルーティングにメソッド名をつけない場合はresourceでルーティングしないとだめみたいな話も出てました。(少し今回とは違う内容ですが)
つまり、この場合だと
Route::resource('user/{id}', 'ShowProfile');
とするか
Route::get('user/{id}', 'ShowProfile@show');
のようにするかであれば解決することができます。
しかし、これであれば上記でお話したように通常通りにコントローラーを作成して単一のメソッドを作るのと変わらないですね。
シングルアクションのコントローラーを作るには
最終的な対応策として ルーティングを定義 → コントローラーを作成
としていたのを コントローラーを作成 → ルーティングを定義
としました。
したがって一旦 web.php
内のルーティングに関する行を消去して
php artisan make:controller ShowProfile --invokable
を実行するとアクションが作成できました。
本質的な解決ではないので、誰か他に解決策を知っている方がいればぜひ教えてください。