質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

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

PHP

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

Q&A

解決済

1回答

492閲覧

Laravelのルーティングについて

blacktm06

総合スコア6

Laravel

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

PHP

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

0グッド

0クリップ

投稿2023/04/18 02:32

編集2023/04/18 04:06

実現したいこと

新規投稿の登録

前提

Laravelで投稿のシステムを作っています。
投稿前に確認画面を出したいので流れとしては、
GET:作成画面(create)

POST:(check)

  1. validate
  2. セッションに保存
  3. 確認画面への遷移

GET:確認画面(confirm)

  1. セッションから取り出す
  2. 確認画面を表示

POST:保存処理(store)

  1. セッションから取り出す
  2. (validate)
  3. 保存処理

としています。

発生している問題・エラーメッセージ

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

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

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

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

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

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

guest

回答1

0

自己解決

web.php

1Route::get('/topics/{topic}/edit/confirm', [App\Http\Controllers\TopicEditController::class, 'confirm'])->name('topics.edit.confirm'); 2Route::put('/topics/{topic}/edit/update', [App\Http\Controllers\TopicEditController::class, 'update'])->name('topics.edit.update');

Route::get('/topics/{topic}/confirm'Route::get('/topics/{topic}/edit/confirm'とeditが抜けいていました。付け足すと無事遷移しました。

投稿2023/04/18 04:24

blacktm06

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問