###前提・実現したいこと
フォームから受け取った配列のバリデーションをしたい。
###仕様
・2つのセレクトボックスをもつフォームを@forループで複数行作成。
渡ってくるリクエストパラメータは下記のようなイメージ
==============================
array(2) {
["name_a"]=>
array(5) {
[0] => string(0) ""
[1] => string(1) "1"
[2] => string(1) "2"
[3] => string(1) "3"
[4] => string(0) ""
}
["name_b"]=>
array(5) {
[0] => string(0) ""
[1] => string(1) "1"
[2] => string(0) ""
[3] => string(0) ""
[4] => string(0) ""
}
==============================
・カスタムバリデーション内で、選択されたセレクトボックスが同一かどうか確認。
→同一の場合バリデーションエラーとしたい
・セレクトボックスで選択されたものに対し全てバリデーションチェックし、結果をviewに返す。
###ソースコード
リクエストされるView
php
1// test.blade.php 2// ~中略~ 3 @if ($errors->any()) 4 <div class="alert alert-danger"> 5 <ul> 6 @foreach($errors->all() as $error) 7 <li>{{ $error }}</li> 8 @endforeach 9 </ul> 10 </div> 11 @endif 12 <br> 13 {!! Form::open() !!} 14 <div class="form-inline"> 15 @for ($i = 0; $i < 5; $i++) 16 <?php $n = $i+1 ?> 17 {{ "#$n : " }} 18 <div class="form-group"> 19 {!! Form::select("name_a[$i]", $namelist, null, ['class' => 'form-control', 'placeholder' => "名称A"]) !!} 20 </div> 21 ― 22 <div class="form-group> 23 {!! Form::select("name_b[$i]", $namelist, null, ['class' => 'form-control', 'placeholder' => "名称B"]) !!} 24 </div> 25 <br> 26 <br> 27 @endfor 28 </div> 29 <div class="form-group"> 30 {!! Form::submit(' 登 録 ', ['class' => 'btn btn-primary']) !!} 31 </div> 32 {!! Form::close() !!} 33// ~中略~
カスタムバリデーション
php
1<?php 2namespace app\Services; 3 4class CustomValidator extends \Illuminate\Validation\Validator 5{ 6 public function validateBoo() 7 { 8 9 if($this->data['name_a'] == $this->data['name_b']){ 10 return false; 11 } 12 return true; 13 14 } 15 16}
コントローラー
php
1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use App\Http\Requests; 7use App\Http\Controllers\Controller; 8 9class GameResultController extends Controller 10{ 11// ~中略~ 12 13 public function store(Request $request) 14 { 15 $formlist = $request->all(); 16 17 foreach ($request->get('name_a') as $key => $value) { 18 $i= $key+1; 19 20 if (("" !== $formlist ["name_a"][$key]) && ("" !== is_null($formlist ["name_b"][$key])) 21 { 22 23 $rules['name_a.'.$key] = 'boo'; 24 $messages['name_a.'.$key.'.boo'] = '#'.$i.' :同一の名称が選択されています。'; 25 26 } 27 } 28 29 /*** バリデーション実行 ***/ 30 $this->validate($request,$rules,$messages); 31 32 // ~中略~ 33 34 } 35} 36
###発生している問題・エラーメッセージ
連続するバリデーション内でエラーと判定されなかったものが存在する場合に、
エラーとなるべき項目が無視されて後続が処理される。
・以下のように連続してバリデーションエラーとなる場合は、
正常にviewにエラーメッセージが表示されます。
(配列0~3までがエラーとなり、4つのエラーメッセージが表示されます)
array(2) { ["name_a"]=> array(5) { [0] => string(1) "1" [1] => string(1) "2" [2] => string(1) "3" [3] => string(1) "4" [4] => string(0) "" } ["name_b"]=> array(5) { [0] => string(1) "1" [1] => string(1) "2" [2] => string(1) "3" [3] => string(1) "4" [4] => string(0) "" }
・以下のような場合は、途中のエラーとなるべき箇所が無視されて後続を処理してしまいます。
array(2) { ["name_a"]=> array(5) { [0] => string(1) "1" [1] => string(1) "2" [2] => string(1) "3" [3] => string(1) "4" [4] => string(0) "" } ["name_b"]=> array(5) { [0] => string(1) "1" [1] => string(1) "2" [2] => string(1) "2" [3] => string(1) "4" [4] => string(0) "" }
そもそも、やり方自体が違う等あるかもしれません。
どなたか、お力添え頂ければ幸いです。
###補足情報(言語/FW/ツール等のバージョンなど)
・XAMPP
・Laravel 5.2.7
・PHP 7.0.1
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/08 13:07
2016/02/09 14:53