エラー内容
Laravelでルーティングを設定した後にブラウザでアクセスを試した際に、以下のエラーが発生。
Route [ルーティング名] not defined.
「ルーティングが正しく定義されていない」というエラー内容です。
コードを確認しても間違っていないのにエラーを解消できないことがあるので、その場合の解決方法を記事にして残しておこうと思います。
誤った点・補足等があれば、ご指摘していただけますと幸いです。
ルーティングを確認してみる
エラー内容の通り、ルーティングの定義が正しくできていない可能性が高いので、まずは設定しているルーティングの内容を確認してみます。
以下のコマンドを実行してLaravelで設定されているルーティング一覧を表示します。
(この時、ルーティング設定しているファイル(routes/web.php)を確認するのも良いですが、コードが多いと何かと間違いに気づけないことも多いので、コマンド実行がおすすめです。)
php artisan route:list
コマンドを実行すると以下のように現在設定されているルーティング一覧が表示されます。
1行ずつ設定されているルーティングの情報が表示されており、左から順番にメソッド、ルーティング、ルーティング名...と書かれています。
大事なのは、今回発生したエラーのルーティング名(「Route [] not defined. 」の[ ]内にあたる部分)が正しく定義されいるかです。
恐らくエラーが発生した場合は、ここに定義したはずのルーティング名が表示されていないのではないでしょうか。
リソースコントローラを用いてる場合は注意
コード上ではルーティングを正しく定義しているけどLaravel側では定義されていない場合、同じルーティングが重複して定義が上書きされている可能性が高いです。
特に、リソースコントローラを用いている場合は注意が必要です。
リソースコントローラは、CRUD操作を行うコントローラがセットになったもので、resourcesメソッドを用いるとたった1行でCRUD操作のルーティングを自動で作成することができます。
Laravel 8.x コントローラ
Route::resource('users', QuizController::class);
1行で複数のルーティングを定義できるという便利な反面、自動的に定義されたルーティングが何であるのかをしっかり把握しておく必要があります。
これを把握できていないと、気づかないうちに新しく作成したルーティングによって定義が上書きされてしまいます。
例えば、以下のようにルーティングを定義した場合、
Route::resource('users', UserController::class);
Route::get('users/create', [UserController::class, 'create'])->name('users.make');
上のresouecesメソッドで定義された「users/create」(ルーティング名 users.create)は下で定義した「users/create」(ルーティング名 users.make)によって上書きされます。
実際に、「php artisan route:list」を実行して確認すると、「user/create」は下で定義した「users.make」という名前になっていることが分かります。
このように、resourcesメソッドを用いている場合、知らぬ間にリソースコントローラのルーティングを上書きしてしまうことがあります。
その結果、今回のエラーの発生要因にもなりやすいです。
この場合、どちらかのルーティングの定義を重複しないように変更すれば解決できます。
キャッシュを削除してみる
ルーティングの定義の上書きがないことを確認したのにエラーがまだ解決できない場合、Laravel内部のキャッシュが原因で変更が反映されていない可能性があります。
その場合、以下のコマンドを実行してキャッシュを削除すると解決できます。
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
まとめ
Laravelで「Route [ ] not defined.」のエラーが発生したら、
- 「php artisan route:list」を実行してルーティングが定義されていないか確認する。
- リソースコントローラを用いている場合はルーティングの定義の上書きに注意する。
- キャッシュを削除してみる。
参考サイト