LoginSignup
17
13

More than 5 years have passed since last update.

Laravelでシングルアクションコントローラーを定義するとInvalid route actionが出る問題

Posted at

Laravel知れば知るほど便利度と自由度の高さには驚かされます。

Railsに似ていることもあり、採用するサービスや使っている人もどんどん増えているみたいですね。

そんな中でLaravelのシングルアクションコントローラーという概念があります。

今回は、そのコントローラーを作成する際 Invalid route action というエラーに少し詰まったので備忘録として残します。

シングルアクションコントローラーとは

その名の通りアクションが1つだけのコントローラーです。

Laravelの場合、シングルアクションコントローラーにはコントローラーの中にinvokeメソッドだけが存在しています。

この話のようにできるだけコントローラーはシンプルにしたいものですよね。

1つのアクションが存在しているだけのコントローラーなんか通常通りにコントローラーを作成してメソッドを1つだけ作ればいいのではないか?という話もありますが、 明示的に単一のアクションがある方が可読性が上がるのかな?と思います。(その他のメリットはまだ勉強中です…)

アクションが作成されない

Laravelの公式ページ
https://readouble.com/laravel/5.7/ja

さて本題に入りますが今回、上記の公式ページ通りにシングルアクションコントローラーを作成しました。

ルーティングを公式ページ通り下記のように設定します。

/routes/web.php
Route::get('user/{id}', 'ShowProfile');

そして対応するコントローラーを作成するコマンド。

php artisan make:controller ShowProfile --invokable

とすると下記エラーが発生。

Invalid route action: [App\Http\Controllers\ShowProfile].

ルーティングがだめだとのことでした。

stackoverflow なんかを見てみるとルーティングにメソッド名をつけない場合はresourceでルーティングしないとだめみたいな話も出てました。(少し今回とは違う内容ですが)

つまり、この場合だと

web.php
Route::resource('user/{id}', 'ShowProfile');

とするか

web.php
Route::get('user/{id}', 'ShowProfile@show');

のようにするかであれば解決することができます。

しかし、これであれば上記でお話したように通常通りにコントローラーを作成して単一のメソッドを作るのと変わらないですね。

シングルアクションのコントローラーを作るには

最終的な対応策として ルーティングを定義 → コントローラーを作成 としていたのを コントローラーを作成 → ルーティングを定義 としました。

したがって一旦 web.php 内のルーティングに関する行を消去して

php artisan make:controller ShowProfile --invokable

を実行するとアクションが作成できました。

本質的な解決ではないので、誰か他に解決策を知っている方がいればぜひ教えてください。

17
13
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
13