こんにちは、遠藤です。
Laravelのバリデーションを使用していてbladeに$errorに加えて他の変数も返却したいと思った時につまずいたので、つまずいた点と解決方法を紹介させていただきます。
- バリデーション時にold()が正常に機能しない
- $errorに加えて他の変数も返却する方法
- bladeで表示する方法
1. バリデーション時にold()が正常に機能しない
Laravelでバリデーションを実装する場合は以下のようなコードで実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// バックエンド public function samplePost( Request $req ) { $rules = [ 'sample1' => ['required'], 'sample2' => ['required'], 'sample3' => ['required'], 'sample4' => ['required'], ]; $validator = Validator::make( $req->all(), $rules ); if ($validator->fails()) { return redirect()->back()->withErrors($validator)->withInput(); } } // フロントエンド @if ($errors->any()) <div id="alert"> <ol> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ol> </div> @endif <input type="text" name="sample1" value="{{ old('sample1') }}" > <input type="text" name="sample2" value="{{ old('sample2') }}" > <input type="checkbox" name="sample1" value="{{ old('sample3') }}" > <input type="checkbox" name="sample2" value="{{ old('sample4') }}" > |
しかし、フロントエンドで使用していたW2UIというJSライブラリの仕様により、old()が正常に機能しないという事象が発生しました。そのため、バックエンドから$errorに加えて必要な情報を返却して、old()の代わりに呼び出して表示する必要が出てきました。
2. $errorに加えて他の変数も返却する方法
以下はタイプがチェックボックスであるsample3とsample4のold()が正常に機能しなかった場合にそれらをwith()というメソッドを使用して返却する方法です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// バックエンド public function samplePost( Request $req ) { $rules = [ 'sample1' => ['required'], 'sample2' => ['required'], 'sample3' => ['required'], 'sample4' => ['required'], ]; $validator = Validator::make( $req->all(), $rules ); if ($validator->fails()) { return redirect()->back()->with([ 'sample3' => $req->sample3, 'sample4' => $req->sample4, ])->withErrors($validator)->withInput(); } } |
3. bladeで表示する方法
以下のようにsession()を使用して表示します。
最初は$errorやveiw()で返却した時のように{{ ‘sample3’ }}とするだけで表示されるかと思っていたのでつまずきました。session()で指定する必要がありその上で、session()->has()で分岐しなければ表示されませんでした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// フロントエンド @if ($errors->any()) <div id="alert"> <ol> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ol> </div> @endif <input type="text" name="sample1" value="{{ old('sample1') }}" > <input type="text" name="sample2" value="{{ old('sample2') }}" > @if(session()->has('sample3')) <input type="checkbox" name="sample1" value="{{ session('sample3') }}" > @else <input type="checkbox" name="sample1" value="" > @endif @if(session()->has('sample4')) <input type="checkbox" name="sample1" value="{{ session('sample4') }}" > @else <input type="checkbox" name="sample1" value="" > @endif |