
Laravelを学習中の初学者です。
Controllerを2種類使ったプログラムを作っているのですが、
画面遷移の際に表記のエラーが出てしまい解決法が分からない状況です。
すみませんが、下記コードを参照いただいて解決法をご教授下さればと思い投稿しました。
<開発環境>
OS Windows 10 64ビット
PHP 8.1.4
Laravel 9.8.1
<実現したいこと>
「保存」ボタンを押すことで以下の動作を実現したい。
1.manual.storeを実行してデータ保存。※データ保存は成功している
2.step.createへのリダイレクト
3.step.createの動作によって、ビューファイル(create.blade.php)を表示
<エラー内容>
アクセスしようとすると、Route [step.store] not defined. エラーが発生。
step.storeは、3の動作で表示したいcreate.blade.php上に記載されているルートです。
そのため、StepControllerのstoreメソッドか、1~3のどこか、もしくはルート定義に
問題があると予想しているのですが、原因箇所を特定することができていません。
以下は該当のコードです。
必要な情報があれば指示いただきたいです。お手数ですが、ご確認よろしくお願いします。
StepController.php
public function create() { $number = 1; return view('step.create', [ 'step_num' => $number, ]); } public function store(Request $request) { $inputs=$request->validate([ 'body'=>'required|max:500', 'image'=>'image|max:1024' ]); $step=new Step(); $step->id=$number; $step->body=$request->body; $step->manual_id=$manual->id; if (request('image')){ $original = request()->file('image')->getClientOriginalName(); $name = date('Ymd_His').'_'.$original; request()->file('image')->move('storage/images', $name); $step->image = $name; } $step->save(); $number++; return view('step.create', [ 'step_num' => $number, ])->with('message', 'このステップを保存しました'); }
ManualController.php
public function store(Request $request) { // manualのtitleへ、入力した名前を代入する。 $inputs=$request->validate([ 'title'=>'required|max:30', ]); $manual=new Manual(); $manual->title=$request->title; $manual->user_id=auth()->user()->id; $manual->save(); return redirect()->route('step.create')->with('message', 'タイトルを保存しました'); }
最初に保存ボタンを押すbladeファイル
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div class="mx-4 sm:p-8"> <form method="post" action="{{route('manual.store')}}" enctype="multipart/form-data"> @csrf <div class="w-full flex flex-col"> <label for="title" class="font-semibold leading-none mt-4">マニュアルの名前</label> <textarea name="title" class="w-auto py-2 placeholder-gray-300 border border-gray-300 rounded-md" id="title" cols="30" rows="10" placeholder="マニュアルの名前を記入してください。(最大30文字)">{{old('title')}}</textarea> </div> <x-button2 class="mt-4"> マニュアルの名前を確定させる </x-button2> </form> </div> </div>
manual.storeのリダイレクトで表示したいbladeファイル
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div class="mx-4 sm:p-8"> <form method="post" action="{{route('step.store')}}" enctype="multipart/form-data"> @csrf <div class="w-full flex flex-col"> <label for="body" class="font-semibold leading-none mt-4">ステップ{{$step_num}}の手順</label> <textarea name="body" class="w-auto py-2 placeholder-gray-300 border border-gray-300 rounded-md" id="body" cols="30" rows="10" placeholder="ステップ{{$step_num}}の手順を入力してください。(最大500文字)">{{old('body')}}</textarea> </div> <div class="w-full flex flex-col"> <label for="image" class="font-semibold leading-none mt-4">参考画像を添付する(任意) </label> <div> <input id="image" type="file" name="image"> </div> </div> <x-button1 class="mt-4"> このステップを保存する </x-button1> </form> <form method="post" action="{{route('step.complete')}}" enctype="multipart/form-data"> @csrf <x-button2 class="mt-4"> マニュアルを完成させる </x-button2> </form> </div> </div>
web.php(質問内容の追加箇所)
<?php use App\Http\Controllers\StepController; use App\Http\Controllers\ManualController; use Illuminate\Support\Facades\Route; /* |-------------------------------------------------------------------------- | 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! | */ Route::get('/', function () { return view('welcome'); }); Route::get('/dashboard', function () { return view('dashboard'); })->middleware(['auth'])->name('dashboard'); Route::resource('step', StepController::class); Route::resource('manual', ManualController::class); Route::post('step', [StepController::class, 'complete'])->name('step.complete'); require __DIR__.'/auth.php';
回答1件
あなたの回答
tips
プレビュー