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

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

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

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

7580閲覧

formよりpostした場合にredirectせず、前の画面に戻しエラーメッセージを表示する方法

toll_tree

総合スコア199

Laravel

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/07/08 03:34

編集2019/07/08 04:27

以下のコードについて、お聞きしたいことがあります。コードは該当の部分を抜粋して記載してあります。
下記はreservation_info.blade.phpです。

<div class="input_info_box"> @if(count($errors) > 0) <div class="errors_box"> <ul> @foreach($errors->all() as $error) <li class="error_message">{{$error}}</li> </ul> @endforeach </div> @endif <h3 class="infomation_title">下記の情報を入力してください</h3> <form class="info_table_form" action="/reserve/confirm_form" method="post"> {{ csrf_field() }} <input type="hidden" name="date" value="{{$reserved_date}}({{$reserved_dayOfWeek}}){{$reserved_time}}~"> <table class="input_info_table"> <tr><th>来院目的</th><td>初めての来院&ensp;(初めて〇〇〇動物病院に来院さ…</td></tr> <tr><th>希望日時</th><td>{{$reserved_date}}({{$reserved_dayOfWeek}}){{$reserved_time}}~</td></tr> <tr> <th>飼い主様名<span class="required_check">必須</span></th> <td class="input_name"> <p class="input_content_name">姓</p><input type="text" name="last_name"size="15" value="{{old('last_name')}}" > <p class="input_content_name">名</p><input type="text" name="first_name"size="15" value="{{old('first_name')}}" > </td> </tr> <tr> <th>フリガナ<span class="required_check">必須</span></th> <td class="input_name_furigana"> <p class="input_content_name_f">セイ</p><input type="text" name="last_name_furigana"size="15" value="{{old('last_name_furigana')}}" > <p class="input_content_name_f">メイ</p><input type="text" name="first_name_furigana"size="15" value="{{old('first_name_furigana')}}" > </td> </tr> <tr> <th>患者様名<span class="required_check">必須</span></th> <td class="animal_name_td"><input type="text" name="input_animal_name" size="30" name="input_animal_name" value="{{old('input_animal_name')}}"></td> </tr> <tr> <th>種類(犬、猫など)<span class="required_check">必須</span></th> <td> <select name="animal_type"> <option value="犬種" selected>犬種</option> <option value="猫種">猫種</option> <option value="その他">その他</option> </select> </td> </tr> <tr> <th>TEL<span class="required_check">必須</span></th> <td> <input type="text" name="tel[]" maxlength="5" size="7"> <span>ー</span> <input type="text" name="tel[]" maxlength="5" size="7"> <span>ー</span> <input type="text" name="tel[]" maxlength="5" size="7"> </td> </tr> <tr> <th>メールアドレス<span class="required_check">必須</span></th> <td class="mail_td"><input type="text" name="mail" value="{{old('mail')}}"></td> </tr> <tr> <th class="other_th">その他<p class="other_description"><span class="color_red">※</span>動物種名でその他を入力された方は動物種名を入力してください</p></th> <td class="other_td"><textarea name="other" maxlength="100"></textarea></td> </tr> </table> <a class="back_button info_back_button" href="javascript:history.back()">戻る</a> <input class="check_input_form" type="submit" value="確認する"> </form> </div>

下記は、web.phpになります。

Route::post('/reserve/reservation_time','ReserveController@reserve_time'); Route::post('/reserve/infomation','ReserveController@reserve_info');

以下は、ReserveController.phpです。

php

1public function reserve_time(Request $request){ 2 // dd($request->calendar_date); 3 $reserve_date = $request->calendar_date; 4 // dd($reserve_date); 5 6 // dd($reserve_date); 7 $reserved_time_list = Reservation::where('reservation_date','like',$reserve_date.'%')->pluck('reservation_date'); 8 9 // dd($reserved_time_list); 10 11 //carbonオブジェクトに変換 12 foreach($reserved_time_list as $key => $reserved_time){ 13 $reserved_time_list[$key] = Carbon::parse($reserved_time); 14 } 15 16 17 //予約された日にちの年月日取得 18 $current_date = new Carbon(); 19 $reserve_date = Carbon::parse($reserve_date); 20 // dd($reserve_date); 21 $date_format = $reserve_date->format('Y-m-d'); 22 $date_display_formt = $reserve_date->format('Y年m月d日'); 23 24 25 26 $day_of_number = $reserve_date->dayOfWeek; 27 // dd($day_of_number); 28 29 // $reserved_time = $reserved_time_list[0]->format('Y-m-d'); 30 31 // dd($reserved_time); 32 33 // 予約可能時間 34 $time = Carbon::parse($date_format.'10:00:00'); 35 // dd($time); 36 for($i =0; $i < 17; $i++){ 37 38 // dd($time); 39 // var_dump($time); 40 41 if(!$time->between(Carbon::parse($date_format.'12:00:0'),Carbon::parse($date_format.'13:30:0'))){ 42 // var_dump($time); 43 $available_time_zone[] = $time->copy(); 44 45 } 46 47 $time = $time->addMinutes(30); 48 49 } 50 // dd($available_time_zone); 51 52 // dd($reserved_time_list); 53 $occupied = ''; 54 foreach($reserved_time_list as $time_list){ 55 foreach($available_time_zone as $time_zone){ 56 $time = $time_list->format('H:i'); 57 $time_zone_format = $time_zone->format('H:i'); 58 // dd($time_zone_format); 59 // dd($time); 60 if($time == $time_zone_format){ 61 $occupied = $time_zone_format; 62 } 63 64 65 } 66 67 } 68 // dd($occupied); 69 switch($day_of_number){ 70 case 0: 71 $day = '日'; 72 break; 73 case 1: 74 $day = '月'; 75 break; 76 case 2: 77 $day = '火'; 78 break; 79 case 3: 80 $day = '水'; 81 break; 82 case 4: 83 $day = '木'; 84 break; 85 case 5: 86 $day = '金'; 87 break; 88 case 6: 89 $day = '土'; 90 break; 91 } 92 93 // dd($is_reservation); 94 return view('reserve.reservation_time',compact('date_display_formt','day','occupied')); 95 96 } 97 98 public function reserve_info(Request $request){ 99 // dd($request->time); 100 $reserved_time = $request->time; 101 102 // dd() 103 $reserved_date = $request->date; 104 // dd($reserved_date); 105 // dd($request->dayOfWeek); 106 $reserved_dayOfWeek = $request->dayOfWeek; 107 // echo url()->previous(); 108 // dd(); 109 110 // dd($reserved_dayOfWeek); 111 return view('reserve.reservation_info',compact('reserved_time','reserved_date','reserved_dayOfWeek')); 112 113 } 114 public function confirm_form_data(Request $request){ 115 // $last_name = $request->last_name; 116 // $first_name = $request->first_name; 117 // $last_name_furigana = $request->last_name_furigana; 118 // $first_name_furigana = $request->first_name_furigana; 119 // $input_animal_name = $request->input_animal_name; 120 // $animal_type = $request->animal_type; 121 // $tel = $request->tel; 122 // $mail = $request->mail; 123 // $other = $request -> other; 124 125 126 $validator = Validator::make($request->all(),[ 127 'last_name' => 'bail|required|string|max:20', 128 'first_name' => 'bail|required|string|max:20', 129 'last_name_furigana' => 'bail|required|string|katakana|max:30', 130 'first_name_furigana' => 'bail|required|string|katakana|max:30', 131 'input_animal_name' => 'bail|required|max:50', 132 'tel.*' => 'bail|required|numeric|digits_between:3,5', 133 'mail' => 'bail|required|email', 134 'other' => 'bail|required_if:animal_type,その他|max:100', 135 ]); 136 137 if($validator->fails()){ 138 $instance = redirect('/reserve/redirect_form'); 139 $errors = $instance->withErrors($validator); 140 // var_dump($errors); 141 // exit(); 142 } 143 144 // $a = redirect('/reserve/infomation'); 145 // var_dump($a); 146 // exit(); 147 // var_dump(method_exists($a, 'withErrors')); 148 // var_dump(redirect('/reserve')); 149 // exit(); 150 151 152 $input_form_datas = $request->all(); 153 $tel = implode('-',$input_form_datas['tel']); 154 // dd($input_form_datas); 155 unset($input_form_datas['tel']); 156 // dd($tel); 157 return view('reserve.confirm',compact('input_form_datas','tel')); 158 }

お聞きしたいのは、reservation_info.blade.phpからpostした場合、ルーティングによりReserveControllerのconfirm_form_dataアクションが処理されますが、ここでバリデーションにより失敗した場合リダイレクトさせてしまうとgetアクセスとなってしまい、エラーが発生してしまいます。ですが、バリデーションで失敗した場合には、前の画面(reservation_info.blade.php)を表示し、エラーも表示したいと考えています。
redirectの場合は必ずpostになってしまう為、方法がみつかりません。
解決策など、ご存じの方いましたら教えて頂けましたら幸いです。
よろしくお願いします。
※追記です。
confirm_form_dataアクション内にて、以下のように、reserve_info.blade.phpにreturnした場合、html部分の<tr><th>希望日時</th><td>{{$reserved_date}}({{$reserved_dayOfWeek}}){{$reserved_time}}~</td></tr> こちらの$reserved_dateなどの変数の表示はどうすれば良いのかといった部分でつまずいてしまいました。

if($validator->fails()){ $instance = redirect('/reserve/reserve_info'); $validation_data = $instance->withErrors($validator)->withInput(); return view('reserve.reservation_info',compact('validation_data')); }

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

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

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

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

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

toll_tree

2019/07/08 04:25 編集

@mikkameさん 2重送信防止の為にもリダイレクトは必要みたいですね... ですが、このreservation_info.blade.phpはgetアクセスはさせたくないので、どうしていくか...ですね
m.ts10806

2019/07/08 04:24

あぁ・・・回答がついていても解決させないまま放置している質問が沢山ある人でしたね。 「回答して損した」という印象を与えることだけは避けて頂きたいですね。私に限らず。
mikkame

2019/07/08 04:29

RPGパターンを採用した場合 reservation_info.blade.php が postで表示される事がありません。 viewは必ずgetのみで、postは必ずリダイレクトを発行します。 これに準拠すれば今回のような問題は起こりえないのです
toll_tree

2019/07/08 04:40 編集

@mikkameさん そういうことでしたか... 実はreservation_info.blade.phpは他のform部分よりpostされた値を受け取っておりまして、ユーザーがAページで日にちなどの値をformから選択し、Bページで予約時間を選択、そして、2つのページで値の入力が完了していた場合のみ、reservation_info.blade.phpを表示する...という流れで作成しておりました。その為getアクセスにて、いきなりreservation_info.blade.phpを表示させてはダメだなと思ったんですよね...
m.ts10806

2019/07/08 04:42 編集

mikkameさんに補足 どういう風にreservation_infoに遷移するか提示されてないので的確なアドバイスが難しいのですけど、 request内容をきちんとシステム側でチェックすればいいだけの話ですね。 むしろPOSTよりもGETが適当でしょう。 「GETだと自分が処理しきれないからPOSTでなんとかしたい」だとしたらシステム構築の基本形から外れることなので「だったら知りません」となります。
mikkame

2019/07/08 04:55

> getアクセスにて、いきなりreservation_info.blade.phpを表示させてはダメだなと思ったんですよね... ダメではないんじゃないですかね get /formA get /formB post /tempSave (Aの内容、Bの内容を保存させる) get /confirm (Aが保存されてなければAにリダイレクト、Bが保存されてなければBにリダイレクト) post /save みたいな感じにすればいいんじゃないですかね。 tempSaveはtempSaveA/tempSaveBに分けたほうが適切そうですが。
m.ts10806

2019/07/08 05:01 編集

やはり。 回答に書いた「画面遷移の体系図をきちんと作って整理したほうが良いでしょうね」をやってから作ってください。コードを見た限りでは具体的なことは決めずにとりあえず思うところから(言い方は雑だけど)ノリで作っていっているようにしか見えません。 途中で不整合に気づいて軌道を戻そうとしても結局かなり辿らなきゃいけなくなって面倒になって「とりあえず最小限でなんとかならないか」と無理なことをやろうとしていると言っても過言ではないです。 余計に不整合が積み重なってアプリケーションとして成り立たなくなります。 現場でも製造時点でおかしいことに気づいたら設計に戻って設計からやり直すことはよくあります(もちろん設計からやり直すなんて設計の不備でしかないからレビューで落とせないのが悪い)。 もし設計をきちんとやってないのでしたらぐちゃぐちゃになるのは当然ですね。 自身が勉強のために作っているとしても設計なしでは永遠にゴールは近づけません。
toll_tree

2019/07/08 05:08

@mikkameさん アドバイス頂きありがとうございます。 そのような方法は思いつきませんでした...日付が選択されていない状態で時間を選択するページは表示させないようにしたいので、まさに「tempSaveA/tempSaveB」こちらの方法が良いかもしれません!
mikkame

2019/07/08 06:04

ついでに下記のアドバイスも熟読して欲しいです - メンターを見つけ、メンターにアドバイスをもらう事(ラウンジの参加でも可) - PHPの基礎、HTTPの基礎、HTMLの基礎、CSSの基礎、JSの基礎をそれぞれ学ぶ(同時進行はなるべくしない)、基礎は使いこなせるまで。 - あとそもそも合理的思考とかロジックを考える部分が弱い気がするので作る前に考える事 - 1人でなんでも作りたいなら先に設計を学んだほうがいいです、そうでなければ未経験可みたいなところで現場で揉まれるといいでしょう - mts10806さんのアドバイスを進撃に受け止める事 - ベストアンサーをつけず放置をしない
toll_tree

2019/07/08 06:07

@mikkameさん メンターや、ラウンジってなんです?
m.ts10806

2019/07/08 06:17 編集

うん。そこはいい加減Google使おう。 条件反射的に聞く癖は直さないと成長しない。 (まさか他全部スルーしてそこにだけ食いつくと思ってなかった。)
toll_tree

2019/07/08 06:17

@mikkamesさん お金かかるやつですかw でもプログラミングスクールよりは安い?感じですね...
m.ts10806

2019/07/08 06:21

すごーく大雑把にいうと 「金払ってもらえるならしっかり教えてあげよう」という「指導者」という立場です。 正直あなたはteratailのような無料のQAでなんとかなる人ではありません。 オープンソースであるPHP(またはそのプラグインやフレームワーク)はやろうと思えば どこまでも無料で出来るものですが、それではどうしようもない人がメンターを利用します。 teratailでも多くの人に指摘されてきながら(今回もmikkameさんにしっかり指摘されている) 無視して我が道を行きたがる人は無料QAサイトでせこせこやろうとしても成長にはつながらないんですよ。
m.ts10806

2019/07/08 06:30 編集

mikkameさんの「どうそ、メンターをお探しください」というコメントの重さを理解してないようなので 尚更ですね(そもそも回答せずにコメントで済まそうとしているところから感じ取ってもらいたい) 大事なこと全部スルーしてそこにいってしまった。(私は「呆れられた」と感じました)
m.ts10806

2019/07/08 06:40

補足しておくと、安くつくかどうかは基本的に教えてもらう側の資質次第。 サポート体制万全なスクールの方がまだ信用があるでしょう。もちろんそこまでいく人が実務で使えるかというと更に高い資質を問われることになるので、そこは察してください。
m.ts10806

2019/07/08 07:13 編集

考え方のみしか伝えてない回答で、回答も含めてコメントもすべてここまで無反応でいきなり「解決済み」とされても本当に理解を得られたか不安しかないので、きちんとコメントください。 https://teratail.com/help/question-tips#questionTips4-2 ※それにmikkameさんの1つ目以外の指摘を全て無視したままってあり得ません。
guest

回答1

0

ベストアンサー

「リダイレクトしたっぽくない」を演出したいのであれば、Ajaxでバリデーションした結果受け取ってJavaScriptでエラーメッセージをそれぞれセットすれば良いのでは。

というか$validator->fails()の時点でwithErrors伴ってconfirmではなくreservation_infoにreturnすれば良いのでは?

日本語訳マニュアルバリデーションの#バリデータの生成でもpost/createに戻しているので同じことかと思いますが。

もし「getもpostも発生しうる」仕様なのでしたらルーティングにpostしかないのがおかしいということになります。
そこは画面遷移の体系図をきちんと作って整理したほうが良いでしょうね。
特にフレームワーク利用の場合は、きちんと設計してから作っていかないと今みたいにぐちゃぐちゃなコードのまま問題切り分けがどんどん困難な状態になっていきます。

confirm_form_dataアクション内にて、以下のように、reserve_info.blade.phpにreturnした場合、html部分の<tr><th>希望日時</th><td>{{$reserved_date}}({{$reserved_dayOfWeek}}){{$reserved_time}}~</td></tr> こちらの$reserved_dateなどの変数の表示はどうすれば良いのかといった部分でつまずいてしまいました。

画面表示ができているのならreserve_info自体にデータ取得のためのキーは揃えられるはずですし、
reserve_infoを表示するときと同じデータ取得処理を流せるはずです。

※ここはフレームワーク云々より発想の問題

もちろん「同じ処理を流す」からって同じ処理を別の場所に書くのは無駄。
「同じビューでエラーだけ追加」ということで処理を共通化させて内部で分岐したほうがいいですね。

ますます前の質問とわける必要がなくなってきているように思います。

投稿2019/07/08 03:45

編集2019/07/08 04:34
m.ts10806

総合スコア80765

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

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

m.ts10806

2019/07/08 05:03

低評価理由コメントください。 技術的に誤りがあるようでしたらご指摘ください。 訂正、または説明追加しますので。 「ついた高評価を打ち消すため、個人的に嫌いだから」という理由での低評価はお控えください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問