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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

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

Q&A

解決済

2回答

6279閲覧

Laravel5 配列を利用した連続バリデーションに関して

YATORI

総合スコア13

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

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

0グッド

1クリップ

投稿2016/02/07 02:52

編集2016/02/09 14:48

###前提・実現したいこと
フォームから受け取った配列のバリデーションをしたい。

###仕様
・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 &nbsp;&nbsp; 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

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

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

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

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

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

guest

回答2

0

ベストアンサー

まず、いくつかおかしい所を回答とさせていただきます。

1.修正されたControllerで、is_Nullになっていますが大丈夫でしょうか?(Nは小文字では?)
2.validateの内容がそもそもおかしいです。$this->dataで指定した場合はValidatorのdataを参照しているので今の状態だと、name_a配列 == name_b配列をkeyの回数分やっているように見えます。
正常に出ているパターンは、配列の内容がどちらも一緒だからfalseが3回となり、空文字の場合は対象のvalidateが実行されてないので表示されないのでしょう。

これを解決するためにはvalidateBooのメソッドを変更する必要があります。
例えばですが、

public function validateBoo($attribute, $value, $parameters) { if($value === $this->data['name_b'][$parameters[0]]){ return false; } return true; }

として、ルールを

$rules['name_a.'.$key] = 'boo:'. $key;

とすることで、パラメータとして$keyが渡せるので判定可能になります。

投稿2016/02/08 11:25

fagai

総合スコア2158

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

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

YATORI

2016/02/08 13:07

お早い回答感謝いたします! まず、「is_Null」はご指摘の通り間違いです。正しくは「is_null」です。 (なぜかPhpStormで怒られずにそのまま使えていました・・・) validateをご指摘の内容で修正したところ、無事想定通りの判定が行われました。 確かに、バリデータの方で配列を意識できていませんでしたね・・・ なるほど、$parameters をうまく使えばいいのですね。 回答ありがとうございました!!
YATORI

2016/02/09 14:53

回答に関連した部分の編集を行ったのでこちらにもコメントをしておきます。 Controllerのif文内の「is_null」に関してですが、 ""(ダブルクォート)だと空判定してもらえず、毎回全ループしていたことが発覚。 評価方法を変更しました。 解決済みでしたが、万が一参考にされる方がいらっしゃる可能性も加味して編集させていただきました。
guest

0

申し訳ありません。
いったん解決済みとして、凍結させてください。
ソースを確認したところ、初歩的なミスを発見しました。

修正して確認後、再度書き込みます。

投稿2016/02/07 19:12

YATORI

総合スコア13

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

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

YATORI

2016/02/08 05:27

コントローラー内のIF文が間違っていたものを修正しました。 バリデートとは関係ない部分だったので、症状は解決しないままです。 引き続き回答を募集させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問