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

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

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

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

Laravel 5

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

Q&A

解決済

2回答

1691閲覧

【Laravel5.4】sometimes validationの動作について

uramot

総合スコア20

PHP

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

Laravel 5

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

0グッド

0クリップ

投稿2017/06/28 01:48

質問

Laravel5.4でsometimes validationをつける際に、以下の3つの場合で動作の違いがあるか確認したく、質問致しました。

  1. email => 'sometimes|required|email'
  2. email => 'sometimes|email'
  3. email => 'email'

sometimes制約の認識としては、与えたinput配列にfield(今回だとemail)があったときだけvalidationが走るというものだと思っています。
しかし、公式ドキュメントを見ると、以下のように sometiems|requied|email というようにrequired制約もついています。requiredは入力にfieldがチェックするものなので、 sometimes がついていれば必要ないように感じます。
また、 sometimes制約もつけなくても(パターン3)場合も、入力に指定したfield(email)がなければvalidationは走らないと思います。

sometimes制約の正しい書き方と、各パターンに動作の違いがあればご教授頂きたいです。
よろしくお願いいたしますm(__)m

php

1$v = Validator::make($data, [ 2 'email' => 'sometimes|required|email', 3]);

補足

実際に以下のメソッドをEloquentに追加して php artisan tinker で、以下の2つを試してみましたが各パターンのValidation結果に違いはありませんでした。

  1. 入力にfieldがある場合の3パターン
  2. 入力にfieldがない場合の3パターン

php

1 public function validation_test() { 2 $inputs = [ 3 'id' => 1, 4 ]; 5 6 $rules = [ 7 'email' => 'sometimes|required|email', 8 ]; 9 10 $validator = \Validator::make($inputs, $rules); 11 12 if ($validator->fails()) { 13 return $validator->errors()->all(); 14 } elseif ($validator->passes()) { 15 return $this->create($inputs); 16 } 17 18 }

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

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

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

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

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

guest

回答2

0

確かに、sometimesについては、配列に値が無い場合にvalidateの対象外とします。
一方、emailについては、空文字ではエラーにはなりません。
よって、下記のケースはエラーとはなりません

PHP

1$inputs = [ 2 'id' => 1, 3 'email' => '' 4]; 5$rules = [ 6 'email' => 'sometimes|email', 7];

emailフィールドがあったときに入力必須にしたい場合には、'sometimes|required|email'が必要となるのです。

ただ、email => 'sometimes|email'email => 'email'については、結果的に同じ動作をすると思います。この様な単純なケースにおいてはsometimesを使うメリットはあまりないと理解しています。

投稿2017/06/28 03:31

編集2017/06/28 03:44
motuo

総合スコア3027

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

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

uramot

2017/06/28 04:32 編集

ご回答ありがとうございます! email制約だと、空文字だとvalidation通ってしまうので`sometimes|required`とする必要があるんですね。required制約の動作で勘違いしていた部分があったみたいです。ありがとうございます! また、 `email => sometimes|email` と `email => email` は同じ動作になるのですね。`sometimes` は基本的に `required` とセットで使うという認識で良いですかね。
guest

0

ベストアンサー

何が正しいかはどういう動作を期待するかによるのでなんともいえませんが、sometimesはパラメタが存在するときのみチェックをするという指定で、パラメタがなければたとえrequiredが指定されていてもOKになります(requiredより優先します)。

emailパラメタがそもそも存在しない場合、nullの場合、空文字列の場合、正しい場合でそれぞれの条件での結果を表示するプログラムと実行結果を示しますので参考にしてください。

php

1 public static function validation_test() { 2 $inputs = [ 3 'missing' => [], 4 'null' => ['email' => null], 5 'empty' => ['email' => ''], 6 'valid' => ['email' => 'someone@example.net'], 7 ]; 8 9 $rules = [ 10 'sometimes|required|email', 11 'required|email', 12 'email', 13 ]; 14 15 foreach ($rules as $r) { 16 printf("%s\n", $r); 17 foreach ($inputs as $name => $i) { 18 $validator = \Validator::make($i, ['email' => $r]); 19 printf( 20 " %-7s %s\n", 21 $name, 22 $validator->fails()? implode(',', $validator->errors()->all()): 'ok' 23 ) ; 24 } 25 printf("\n"); 26 } 27 }
sometimes|required|email missing ok null The email field is required. empty The email field is required. valid ok required|email missing The email field is required. null The email field is required. empty The email field is required. valid ok email missing ok null The email must be a valid email address. empty ok valid ok

投稿2017/06/28 03:45

crhg

総合スコア1175

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

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

uramot

2017/06/28 05:50

とても丁寧に、テストコードと結果まで添付していただいてありがとうございます! sometimes|required|email|, |sometimes|email|, |email|でvalidation結果に違いがでるのがひと目でわかりました。ありがとうございますm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問