🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ルーティング

ルーティングとは、TCP/IPネットワークにおいて、目的のホストまでパケットを送る為のパス選定のプロセスを言います。

Q&A

解決済

1回答

2465閲覧

Laravel 404エラー ~ ルート存在確認済、httpd.confにて"Allowoverride All"設定、ルートの優先順位確認もしたが、viewで生成したURLが404エラー

sssNaoto

総合スコア9

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ルーティング

ルーティングとは、TCP/IPネットワークにおいて、目的のホストまでパケットを送る為のパス選定のプロセスを言います。

0グッド

0クリップ

投稿2021/02/05 07:04

編集2021/02/05 10:16

見つけていただきありがとうございます。

表題の通り、Laravelの404エラーでハマっています。
私の理解の範囲でできることは試し尽くしてしまったので、何卒お力添えいただきたく思います。

基本情報

Laravel 8.22.0
PHP 7.4.12
MAMPにてローカル開発
サーバーはartisanで起動

view

以下のリンクが404エラーとなっています。

@foreach($posts as $post) <p><a href="index_explanation/show/{{$post->genre}}">{{ $post->title }}</a></p> @endforeach

ルーティング

今回問題になっているルーティングは最下部に記載されています。

use App\Http\Controllers\Admin\ExplanationController; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ // Auth::routes(); Route::get('/', 'HomeController@index')->name('/'); // ログイン周り Route::get('/login', 'Auth\LoginController@showLoginForm')->name('login'); Route::post('/login', 'Auth\LoginController@login'); Route::post('/logout', 'Auth\LoginController@logout')->name('logout'); Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register'); Route::post('register', 'Auth\RegisterController@register'); Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request'); Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email'); Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset'); Route::post('password/reset', 'Auth\ResetPasswordController@reset')->name('password.update'); //メインページ Route::get('/index', 'IndexController@index')->name('index'); // Route::get('/mypage', 'IndexController@mypage')->name('mypage'); //問題一覧サブページ Route::get('/index/genre_value/options/{genre_value}', 'IndexController@options'); Route::get('ajax/answers', 'Ajax\AnswersController@index')->name('mypage'); Route::get('/explain/{genre_value}', 'IndexController@explain'); //履歴関連 Route::get('/hists/{user_id}', 'IndexController@show_Hists'); Route::get('/hists/detail/{created}', 'IndexController@histDetail'); Route::get('/explain/{genre_value}', 'IndexController@explain')->name('explain'); //問題表示 Route::POST('/questions/question','QuestionController@showQuestions'); //回答入力フォームの送信先 Route::POST('/questions/answer','QuestionController@correctQuestions'); Route::POST('/questions/answer/save','QuestionController@saveAnswers'); Route::POST('/hists/hist_detail','IndexController@histDetail'); Route::get('/posts/index', 'PostsController@index'); Route::get('/posts/create', 'PostsController@create'); Route::POST('/posts', 'PostsController@store'); Route::get('/posts/{post}', 'PostsController@show'); Route::get('/posts/{post}/edit', 'PostsController@edit'); Route::patch('/posts/{post}', 'PostsController@update'); Route::delete('/posts/{post}', 'PostsController@destroy'); // 管理者ログイン用 Route::get('/login/admin', 'Auth\LoginController@showAdminLoginForm'); Route::get('/register/admin', 'Auth\RegisterController@showAdminRegisterForm'); Route::post('/login/admin', 'Auth\LoginController@adminLogin'); Route::post('/register/admin', 'Auth\RegisterController@createAdmin')->name('admin-register'); Route::view('/admin', '/admin/admin')->middleware('auth:admin')->name('admin-home'); // 解説編集画面 Route::get('/admin/index_explanation', 'Admin\ExplanationController@index'); //404エラーとなるルーティング Route::get('/admin/index_explanation/show/{genre}', [ExplanationController::class, 'show']); //laravel8推奨の形にする前のルーティング Route::get('/admin/index_explanation/show/{genre}', 'Admin\ExplanationController@show');

コントローラ

namespace App\Http\Controllers\Admin; use App\models\Admin\Explanation; use App\Http\Controllers\Controller; class ExplanationController extends Controller { //問題のURIが書いてあるviewに対するメソッド public function index() { $posts = Explanation::latest()->get(); return view('admin.indexExplanation',compact('posts')) ; } //問題になっているルーティングでアクセスするはずのメソッド public function show($genre) { $posts = Explanation::findOrFail($genre); return view('admin.showExplanation',compact('posts')); } }

httpd.conf

<Directory "/"> Options Indexes FollowSymLinks AllowOverride ALL </Directory> //ルートを"/プロジェクト名/public/"に変更してMAMP再起動も試しましたが、変化ありませんでした。

改善のために行ったこと

  1. Laravel8推奨のルーティング記載方法。
  2. httpd.confの書き直し。(結果現状の形)
  3. ルーティングの優先順位上げ(他のルーティングよりも上に記載して試してみただけですが、それぐらいしか思いつけませんでした)
  4. routeのキャッシュクリア
  5. ルートの存在確認。

イメージ説明
admin/index_explanation/show/{genre} が表示されているので、問題ないと判断しました。

補足

  1. 問題のURIのパラメータには、問題なく値が渡っていることは確認できています。
  2. 他のルーティングは機能していることを確認しています。
  3. もともとview側では以下のようにuriを生成していました。
<a href="{{ action('ExplanationController@show', {{$post->genre}}) }}">{{$post->genre}}</a>

しかし、viewの画面に遷移した時点で下記のエラーが出ました。

Action App\Http\Controllers\ExplanationController@show not defined.

関連があるか不明ですが、なにかの参考になれば幸いです。
また、できればこの形でuriを生成できればと思っておりますので、
このAction not definedのエラーに関してもなにかわかる方がいらっしゃれば、
ご教示いただけますと幸いです。

以上、お目通しいただいてありませんでした。
もし足りない情報があれば、追加させていただきます。

また、ここまで読んでいただいてタイポなどのしょうもないミスだったら、本当に申し訳ございません。

何卒宜しくお願いします。

追記

  1. httpd.confにて"ALL"に変更した"AllowOverride"を囲んでいるルートディレクトリを"/Applications/MAMP/htdocs/プロジェクト名/public/"に変更してMAMP再起動たが改善できず。
  2. mod_rewrite.soを有効にしてApacheを再起動するも改善できず。
  3. storage下とbootstrap/cacheディレクトリをWebサーバから書き込み可能にしてMAMP再起動するも改善できず。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ルートに名前を付けて、その名前からURLを生成するのはどうでしょうか。

php

1Route::get('/admin/index_explanation/show/{genre}', [ExplanationController::class, 'show'])->name('admin.explanation.show');
... <a href="{{ route('admin.explanation.show', ['genre' => $post->genre]) }}"> ...

参考: 名前付きルート

また、showアクションでは以下のようにする必要があります。findOrFailメソッドはIDで検索するメソッドですが、genreはIDではないと思いますので。

php

1 $posts = Explanation::where('genre', $genre)->firstOrFail();

投稿2021/02/05 07:34

編集2021/02/05 13:55
Lulucom

総合スコア1899

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sssNaoto

2021/02/05 09:59

Lulucom様 ご回答ありがとうございます! 残念ながら、結果は変わりませんでした。 個人的には、httpd.confか、やはりroutingの書き方か、laravel8の知らない仕様にどこかが引っかかっているかの線が怪しいかと思っています。 もし何か見解などお持ちなら、共有していただけると大変ありがたいです。
Lulucom

2021/02/05 12:18 編集

上記のように、名前付きルートにして、リンクのURLをその名前から生成した場合、404エラーになったときのURL(ブラウザのアドレスバーのURL)は、意図された通りのURLになっていますか? また、ExplanationControllerクラスのshowアクションが実行されてはいるけど、その最初の行の $posts = Explanation::findOrFail($genre); で$genreに該当するExplanationが取得できずに例外が発生した結果、404エラーになっている可能性もあります。 モデルのfindとかfindOrFailはIDで検索するメソッドですが、多分、$genreの値ってIDではないですよね?ID以外の値で検索したい場合は、例えば以下のようにするとどうでしょうか。 $posts = Explanation::where('genre', $genre)->firstOrFail();
sssNaoto

2021/02/05 13:39 編集

お返事ありがとうございます! はい、URLは意図したものになっていました。 "モデルのfindとかfindOrFailはIDで検索するメソッドですが"これに関しては完全に無知でした。 仰るとおり、$genreはIDではありませんので、誤っている可能性が高いです。 また、これならview側のリンクの ”{{ action('ExplanationController@show', {{$post->genre}}) }}” の形でNot definedのエラーが出る説明もつく気がします。 さっそく試してみます。
sssNaoto

2021/02/05 13:47

提示していただいたコードで解決しました! もしLulucom様がいなければ、いつ解決できたかわかりません。 また、とても勉強になりました。 ありがとうございました!!!
Lulucom

2021/02/05 13:49

いえいえ、良かったです。回答に追記しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問