実現したいこと
新規投稿の登録
前提
Laravelで投稿のシステムを作っています。
投稿前に確認画面を出したいので流れとしては、
GET:作成画面(create)
POST:(check)
- validate
- セッションに保存
- 確認画面への遷移
GET:確認画面(confirm)
- セッションから取り出す
- 確認画面を表示
POST:保存処理(store)
- セッションから取り出す
- (validate)
- 保存処理
としています。
発生している問題・エラーメッセージ
topics/create/confirmへ遷移するものの404となります。
該当のソースコード
web.php
1 //Create 2 Route::get('/topics/create', [App\Http\Controllers\TopicCreateController::class, 'create'])->name('topics.create'); 3 Route::post('/topics/create', [App\Http\Controllers\TopicCreateController::class, 'check'])->name('topics.create.check'); 4 Route::get('/topics/create/confirm', [App\Http\Controllers\TopicCreateController::class, 'confirm'])->name('topics.create.confirm'); 5 Route::post('/topics/create/store', [App\Http\Controllers\TopicCreateController::class, 'store'])->name('topics.create.store');
TopicCreateController.php
1<?php 2 3namespace App\Http\Controllers; 4 5use App\Models\Topic; 6use Illuminate\Http\Request; 7 8class TopicCreateController extends Controller 9{ 10 public function create() 11 { 12 return view('topics.create'); 13 } 14 15 public function check(Request $request) 16 { 17 $validatedData = $request->validate([ 18 'title' => 'required', 19 'content' => 'required', 20 ]); 21 $request->session()->put('topic-create-input', $validatedData); 22 return redirect()->route('topics.create.confirm'); 23 } 24 25 public function confirm(Request $request) 26 { 27 //@TODO load from sesstion 28 $input = $request->session()->get('topic-create-input'); 29 if (!$input) { 30 return redirect()->route("topics.create")->withErrors("不正な操作が行われました"); 31 } 32 33 return view('topics.create-confirm', [ 34 "input" => $input 35 ]); 36 } 37 38 39 public function store(Request $request) 40 { 41 $validatedData = $request->validate([ 42 'title' => 'required', 43 'content' => 'required', 44 ]); 45 46 $input = $request->session()->get('topic-create-input'); 47 48 if ($request->input("back") == 1) { 49 return redirect()->route("topics.create")->withInput($input); 50 } 51 52 $topic = new Topic(); 53 $topic->title = $validatedData['title']; 54 $topic->content = $validatedData['content']; 55 $topic->save(); 56 57 $request->session()->forget("topic-create-input"); 58 59 return redirect()->route('topics.index')->withStatus('投稿完了'); 60 } 61}
create.blade.php
1@section('content') 2 <div class="card"> 3 <div class="card-header">新規登録</div> 4 <div class="card-body"> 5 <form action="{{ route('topics.create.check') }}" method="post"> 6 @csrf 7 <div class="form-group mb-3"> 8 <label for="title">タイトル</label> 9 <input type="text" class="form-control" name="title" value="{{ old('title') }}"> 10 </div> 11 <div class="form-group mb-3"> 12 <label for="content">本文</label> 13 <textarea class="form-control ckeditor" name="content">{{ old('content') }}</textarea> 14 </div> 15 <div class="d-flex justify-content-between"> 16 <a href="{{ route('topics.index') }}" class="btn btn-outline-secondary">戻る</a> 17 <button type="submit" class="btn btn-outline-primary">確認</button> 18 </div> 19 </form> 20 </div> 21 </div> 22@endsection
//create-confirm.blade.php @section('content') <div class="card"> <div class="card-header">登録内容確認</div> <div class="card-body"> <form action="{{ route('topics.create.store') }}" method="post"> @csrf <div class="form-group mb-3"> <label for="title">タイトル</label> <input type="text" class="form-control-plaintext" name="title" value="{{ $input['title'] }}"> </div> <div class="form-group mb-3"> <label for="content">本文</label> <div>{!! $input['content'] !!}</div> </div> <button name="back" value="1" type="submit" class="btn btn-outline-warning">修正</button> <button type="submit" class="btn btn-outline-primary">投稿</button> </form> </div> </div> @endsection
補足情報(FW/ツールのバージョンなど)
Laravel Framework 10.7.1
PHP 8.2.0

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。