今回の記事を読んで欲しい方
- Laravel勉強中でルーティングが上手くいかない方
- Laravel7以前の書籍で勉強されている方
- Target class [Controller] does not exist.の解決方法がわからない方
今回はLaravel8からルーティングの書き方が変更されたようなので、その変更点について書いていこうと思います。
Laravel7までのルーティングの書き方
先に少し脱線しますが、転職して入社する2020年10月まで、Laravel7で勉強しておりました。
最近になって休職し、またLaravelを勉強し直そうと思って、書籍に沿って勉強をし直しておりました。
書籍通りに勉強を進めて、Laravelをインストールして、MAMPにデプロイして、web.phpにルート情報を書きました。
Route::get('/hello', 'HelloController@index');
MAMPを起動し、localhostにアクセスすると、以下の画像の表示がされました。
Target class [HelloController] does not exist.???と、頭の中でなりました。
一応、書籍についていたサンプルコードをそのままコピペしても変わらず。
(LaravelをMAMPにデプロイする方法に関しては、下記の記事をご覧ください。)
調べたところ、Laravel8からはLaravel7までの書き方はできなくなったようです。
Laravel7までの書き方
Route::get('/hello', 'HelloController@index');
で書けた理由は、app/Providers/RouteServiceProvider.phpのファイル内に記述されている
// protected $namespace = 'App\\Http\\Controllers';
この記述がコメントアウトされていることが原因です。
もしもLaravel7までの記述で書きたいようであれば、コメントアウトを外せば解決できます。
Laravel8からのルーティングの書き方
ただIT業界もそうですし、プログラミング言語も常にアップデートされていくので、正直なところ新しい書き方で慣れていく方が無難です。
書き方としては、
- 直接パスを指定する方法
- アクション構文を使用する方法
のが簡単な方法です。
直接パスを指定する方法
直接パスを指定する方法は一番簡単だと、個人的に思っています。
ただ、単純な文字の打ち間違いだったりファイルを別のフォルダに移動させた時に修正を加えないといけないことがデメリットです。
web.phpに、コントローラがあるファイルのパスを指定するだけです。
Route::get('/hello', 'App\Http\ControllersHelloController@index');
アクション構文を使用する方法
もう一つ、アクション構文を使用する方法もあります。
web.phpに、使用するクラスを宣言するため、上部に使うコントローラの名前を記述します。
use App\Http\Controllers\HelloController;
次に、ルート構文が少し書き方が変わります。
Route::get('/hello', [HelloController::class, 'index']);
HelloControllerのindexクラスを呼び出す書き方が変更されています。
今回のまとめ
- 今までの書き方が良い方
app/Providers/RouteServiceProvider.phpのファイル内に記述されている
// protected $namespace = 'App\\Http\\Controllers';
こちらのコメントアウトを外し、web.phpに以前までの書き方をする。
Route::get('/hello', 'HelloController@index'); - 直接パスを指定する書き方
コントローラが存在するパスを、直接書き込む形で指定する。
Route::get('/hello', 'App\Http\ControllersHelloController@index'); - アクション構文を使用する書き方
web.phpに、コントローラを使用するuse宣言をする
use App\Http\Controllers\HelloController;
その後、内部的にHelloControllerのindexメソッドを返す記述をする
Route::get('/hello', [HelloController::class, 'index']); - 余談:use宣言が煩わしい方
直接Route構文内に記述してしまってOKです。
ただし記述が長くなります。
Route::get('/hello', [App\Http\Controllers\HelloController::class, 'index']);
Laravel8に変わってからルーティングの書き方が変わっているみたいですが、解決する方法は複数あるみたいですね。
自分に合った方法で、解決してみて下さい。
今回は以上です。