見つけていただきありがとうございます。
表題の通り、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再起動も試しましたが、変化ありませんでした。
改善のために行ったこと
- Laravel8推奨のルーティング記載方法。
- httpd.confの書き直し。(結果現状の形)
- ルーティングの優先順位上げ(他のルーティングよりも上に記載して試してみただけですが、それぐらいしか思いつけませんでした)
- routeのキャッシュクリア
- ルートの存在確認。
admin/index_explanation/show/{genre} が表示されているので、問題ないと判断しました。
補足
- 問題のURIのパラメータには、問題なく値が渡っていることは確認できています。
- 他のルーティングは機能していることを確認しています。
- もともと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のエラーに関してもなにかわかる方がいらっしゃれば、
ご教示いただけますと幸いです。
以上、お目通しいただいてありませんでした。
もし足りない情報があれば、追加させていただきます。
また、ここまで読んでいただいてタイポなどのしょうもないミスだったら、本当に申し訳ございません。
何卒宜しくお願いします。
追記
- httpd.confにて"ALL"に変更した"AllowOverride"を囲んでいるルートディレクトリを"/Applications/MAMP/htdocs/プロジェクト名/public/"に変更してMAMP再起動たが改善できず。
- mod_rewrite.soを有効にしてApacheを再起動するも改善できず。
- storage下とbootstrap/cacheディレクトリをWebサーバから書き込み可能にしてMAMP再起動するも改善できず。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/05 09:59
2021/02/05 12:18 編集
2021/02/05 13:39 編集
2021/02/05 13:47
2021/02/05 13:49