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

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

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

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

Q&A

解決済

1回答

908閲覧

Laravel5.7 RequestクラスでValidate時、サーバでセットした値が復元されない

2mm

総合スコア13

Laravel 5

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

0グッド

0クリップ

投稿2019/01/08 10:53

前提・実現したいこと

Validate処理でエラーがあった場合入力画面に戻りますが、
その際、サーバ側でセットした値を復元したいです。

Validate処理はRequestクラスで共通化しているため、
Requestクラスを利用したいと考えております。
よろしくお願いいたします。

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

入力画面で入力した値は元の値に戻りますが、サーバ側でセットした値が復元できません。

該当のソースコード

PHP

1 $data = $request->all(); 2 $data['hoge'] = 'aaa'; 3 4 $hogeRequest = new HogeRequest(); 5 $hogeRequest->merge($data); 6 $hogeRequest->validate($hogeRequest->rules());

blade

1<span>{{ old('hoge') }}</span>

試したこと

そもそも、Validator::make()で処理すべきかとも思うのですが、
Validate処理を共通化したく、試行錯誤のうえ上記のようになりました。

わかりずらいかと思いますが、何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

今の記述だけでは、oldの参照先(フラッシュデータ)に、hogeの値が含まれないからかと思います。

明示的にフラッシュデータを再保存してみてはどうでしょう?

$hogeRequest->merge($data); $hogeRequest->flash();

これでうまくいくならば、
HogeRequestクラス内で、merge()をオーバーライドするか、オリジナルのmerge代理関数を作成するかで、そちらに処理をまとめておけば、HogeRequestを使うたびにmerge()flash()をセットで記述しなくて済むので、良さそうです。


コメントみましたので、追記です。

なるほど。newで作ったReqeustクラスではセッションが使えないようなら、
Controllerに渡されてきたRequestクラスの方で行うのではどうでしょうか?

public function xxx(Request $request){ $request->merge(['hoge' => 'aaa']); $request->flash();//こちらでも一応やっておく・・・ $data = $request->all(); $hogeRequest = new HogeRequest(); $hogeRequest->merge($data); $hogeRequest->validate($hogeRequest->rules()); }

こちらなら記載のエラーが出ることは無いはずです。

ところで、ちょっと話が変わりますが、
せっかく作ったHogeRequestは、FormRequestとしては使わない(あるいは使えない)理由があるのでしょうか?

FormRequestとして使えば、一度受け取った$requestを、新規で作ったHogeRequestにマージする・・という作業を都度しなくて済みますし、自分でvalidate()関数を呼び出す必要もありません。
普通のRequestクラスとも相違なく使えるので、Validation処理の共通化としてはこちらの方が良いような気がするのですが・・・?

投稿2019/01/09 05:52

編集2019/01/10 00:53
mix-peach

総合スコア1910

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

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

2mm

2019/01/09 10:56

試してみたところ、エラーになりました。 RuntimeException Session store not set on request. うまくいきませんね。。 やはり Validator::make() で処理すべきなのでしょうね。。
2mm

2019/01/10 02:43

追記確認しました。 やりたかったことができました! ありがとうございます!助かりました! flash() で値の保存ができるのですね。 大変勉強になりました。 FormRequestとして使わない理由ですが、 ファイルアップロード処理を先頭でおこなっており、 そのあとでvalidateを走らせたかったからです。 今回はファイル保存後、他の入力エラーがあって入力画面に戻した際に、 ファイルパスが保持されないことが問題でした。 なんとなくこのあたりのフローが整理しきれていない気はしています。
mix-peach

2019/01/10 04:04

flash() は、old()で参照できる値を保存してます。 formから送られた値は、requestインスタンスが作られた時点で、flash()されているので何もせずともold()で参照できるので、、、もしかすると、sessionの使えるrequestインスタンスであれば、merge()後に自動でflash()されているかもなので(ここらへんlaravelの中身の処理を追い切れなかった^^;)、 $request->flash();//こちらでも一応やっておく・・・ これは消しても大丈夫だったりするかもしれません。 ファイルアップロードの機能があると、確かにFormRequestが使いにくくなりますよねぇ・・ FormRequestの中に、ファイルアップロード処理を書くこともできますが、それが「良い方法」かと言われると微妙なトコロ・・・ とりあえずは、解決できてよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問