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

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

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

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

Laravel 5

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

解決済

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

toll_tree
toll_tree

総合スコア199

Laravel

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

Laravel 5

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

1回答

0評価

0クリップ

4627閲覧

投稿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

public function reserve_time(Request $request){ // dd($request->calendar_date); $reserve_date = $request->calendar_date; // dd($reserve_date); // dd($reserve_date); $reserved_time_list = Reservation::where('reservation_date','like',$reserve_date.'%')->pluck('reservation_date'); // dd($reserved_time_list); //carbonオブジェクトに変換 foreach($reserved_time_list as $key => $reserved_time){ $reserved_time_list[$key] = Carbon::parse($reserved_time); } //予約された日にちの年月日取得 $current_date = new Carbon(); $reserve_date = Carbon::parse($reserve_date); // dd($reserve_date); $date_format = $reserve_date->format('Y-m-d'); $date_display_formt = $reserve_date->format('Y年m月d日'); $day_of_number = $reserve_date->dayOfWeek; // dd($day_of_number); // $reserved_time = $reserved_time_list[0]->format('Y-m-d'); // dd($reserved_time); // 予約可能時間 $time = Carbon::parse($date_format.'10:00:00'); // dd($time); for($i =0; $i < 17; $i++){ // dd($time); // var_dump($time); if(!$time->between(Carbon::parse($date_format.'12:00:0'),Carbon::parse($date_format.'13:30:0'))){ // var_dump($time); $available_time_zone[] = $time->copy(); } $time = $time->addMinutes(30); } // dd($available_time_zone); // dd($reserved_time_list); $occupied = ''; foreach($reserved_time_list as $time_list){ foreach($available_time_zone as $time_zone){ $time = $time_list->format('H:i'); $time_zone_format = $time_zone->format('H:i'); // dd($time_zone_format); // dd($time); if($time == $time_zone_format){ $occupied = $time_zone_format; } } } // dd($occupied); switch($day_of_number){ case 0: $day = '日'; break; case 1: $day = '月'; break; case 2: $day = '火'; break; case 3: $day = '水'; break; case 4: $day = '木'; break; case 5: $day = '金'; break; case 6: $day = '土'; break; } // dd($is_reservation); return view('reserve.reservation_time',compact('date_display_formt','day','occupied')); } public function reserve_info(Request $request){ // dd($request->time); $reserved_time = $request->time; // dd() $reserved_date = $request->date; // dd($reserved_date); // dd($request->dayOfWeek); $reserved_dayOfWeek = $request->dayOfWeek; // echo url()->previous(); // dd(); // dd($reserved_dayOfWeek); return view('reserve.reservation_info',compact('reserved_time','reserved_date','reserved_dayOfWeek')); } public function confirm_form_data(Request $request){ // $last_name = $request->last_name; // $first_name = $request->first_name; // $last_name_furigana = $request->last_name_furigana; // $first_name_furigana = $request->first_name_furigana; // $input_animal_name = $request->input_animal_name; // $animal_type = $request->animal_type; // $tel = $request->tel; // $mail = $request->mail; // $other = $request -> other; $validator = Validator::make($request->all(),[ 'last_name' => 'bail|required|string|max:20', 'first_name' => 'bail|required|string|max:20', 'last_name_furigana' => 'bail|required|string|katakana|max:30', 'first_name_furigana' => 'bail|required|string|katakana|max:30', 'input_animal_name' => 'bail|required|max:50', 'tel.*' => 'bail|required|numeric|digits_between:3,5', 'mail' => 'bail|required|email', 'other' => 'bail|required_if:animal_type,その他|max:100', ]); if($validator->fails()){ $instance = redirect('/reserve/redirect_form'); $errors = $instance->withErrors($validator); // var_dump($errors); // exit(); } // $a = redirect('/reserve/infomation'); // var_dump($a); // exit(); // var_dump(method_exists($a, 'withErrors')); // var_dump(redirect('/reserve')); // exit(); $input_form_datas = $request->all(); $tel = implode('-',$input_form_datas['tel']); // dd($input_form_datas); unset($input_form_datas['tel']); // dd($tel); return view('reserve.confirm',compact('input_form_datas','tel')); }

お聞きしたいのは、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')); }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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つ目以外の指摘を全て無視したままってあり得ません。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Laravel

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

Laravel 5

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