※本記事は、あくまで備忘録です。
Laravelを勉強中です。
現在、画面遷移させると「404 | Not Found」が表示されてしまいます。
ルーティングも出来ているっぽいのですが・・・。
この記事を書いている僕も、独学でLaravelを使ったショッピングサイトを現在実装中でして、上記で詰まりました。
そして無事解決できたので、その解決策を共有したいと思います。
結論として、些細なミスでした(笑)
それでは行きます。
1.実装したい機能
ショッピングサイトで、カテゴリー一覧を画面左側に用意していて、カテゴリーを選択すると対象カテゴリーの商品が一覧表示されるようにするという機能を実装しようとしていました。
要は、URLにカテゴリーIDを仕込んでおき、カテゴリーIDを取得して商品を一覧表示するという機能ですね。
上記機能については、一覧から詳細情報を表示する時に、皆さん割と使用する機能ではないでしょうか。
以下動画が、実装した機能です。(完成版)
2.発生した問題
ルーティング、コントローラー、ビューの実装が完了し、いざ画面を動かしてみたのですが、カテゴリーをクリックしたところ、画面遷移せず「404|Not Found」のエラーが画面に表示。
以下動画の通りです。
ソースも共有しますね。
ルーティング(web.phpで設定)
```
Route::get('/', 'ShoppingController@index'); // 商品一覧(初期画面)
Route::get('/shopping/{id}', 'ShoppingController@show'); // 商品詳細
Route::get('/shopping/category={id}', 'ShoppingController@categoryList'); // 今回の実装で追加したルーティング(結論として、ここに問題がありました)
Route::get('/search', 'SearchController@index'); // 検索機能
Route::get('/custmers/register', 'CustmerController@index'); // カスタマー新規登録```
コントローラー
```
// カテゴリー毎の商品一覧を表示(引数はカテゴリーID(URLから取得する))
public function categoryList ($id){
$products = Product::where('category_id', $id)->paginate(12); // 選択したカテゴリーの商品を取得する
return view('index', [
'products' => $products,
'submenu' => Category::all(),
]);
}```
ビュー
```
<div class = 'subMenu'>
<div class="search-category">
カテゴリーから探す
</div>
<div>
@if(isset ($categorys))
<ul>
@foreach ($categorys as $category)
<li>
<a href="{{ action('ShoppingController@categoryList', $category->id) }}">{{ $category->name }}</a>
</li>
@endforeach
</ul>
@endif
</div>
</div>```
ちなみに、ルーティングがちゃんと設定出来ているかどうか?をターミナルで、「php artisan route:list」コマンドを打ち確認しましたが、反映されていました。
3.解決策
原因は、ルーティング(web.phpで設定)の「Route::get('/shopping/category={id}', 'ShoppingController@categoryList');」の書き方でした。
正しい書き方は、
Route::get('/shopping/category/{id}', 'ShoppingController@categoryList');
です。
これだけで、一発で解決しました。良かったです。
4.最後に
記事は以上となります。
僕の解決策で解決した方がいらっしゃったら、幸いです。
もし解決しなかった若しくは、自分が求める情報じゃなかったよって人は、すみません🙇♂️
でもルーティングは出来ているはずなのに、画面遷移で404エラーが表示という事は、ルーティングは間違いなく出来ています。
つまり、あなたの実装はあと一歩でして、コードの書き方(スペルミス、データの渡し方など)に問題があるはずです。
ですので、今一度あなたがその機能の実装で追加したコードを、見直してみてはいかがでしょうか。
もしくはteratailとかを使って、質問を投げてみるのも良いと思います。(僕も最近使っていて、質問しています。)
以上です、ありがとうございました。