2017-12-08 16 views
0

入力ボックスにスペースのみがあるかどうかを検証しようとしています。Laravel検証用スペース文字は常に失敗しました

これは私の検証です:

<?php 

namespace App\Http\Requests; 

use Illuminate\Foundation\Http\FormRequest; 
use Illuminate\Contracts\Validation\Validator; 
use App\Rules\allAreSpaces; 

class StoreUser extends FormRequest 
{ 
    /** 
    * Determine if the user is authorized to make this request. 
    * 
    * @return bool 
    */ 
    public function authorize() 
    { 
     return true; 
    } 

    /** 
    * Get the validation rules that apply to the request. 
    * 
    * @return array 
    */ 
    public function rules() 
    { 

     return [ 
      'email' => 'required|email|max:64', 
      'phone' => 'bail|required|numeric|phone_min|phone_max|unique:users|not_in:0', 
      'password' => [new allAreSpaces, 'required', 'min:8', 'max:16', 'confirmed'], 
      'password_confirmation' => 'required', 
     ]; 

    } 

    public function messages() 
    { 
     return [ 
      'email.required'  => 'Email address cannot be empty', 
      'email.email'  => 'Enter a valid Email address', 
      'email.max'  => 'Email address cannot exceed 64 characters', 
      'email.unique'  => 'Email already exists', 


      'phone.required'  => 'Mobile number cannot be empty', 
      'phone.numeric'  => 'Mobile number has to be numeric', 
      'phone.phone_min'  => 'Mobile number should contain a minimum 5 characters', 
      'phone.phone_max'  => 'Mobile number cannot exceed 11 characters', 
      'phone.unique'  => 'Mobile number already exists', 
      'phone.not_in'  => 'Enter a valid mobile number ', 


      'password.required'  => 'Password cannot be empty', 
      'password.min'  => 'Password should contain minimum 8 characters', 
      'password.max'  => 'Password cannot exceed 16 characters', 
      'password.confirmed'  => 'Password mismatch.Retry', 

      'password_confirmation.required'  => 'Confirm Password cannot be empty', 
     ]; 
    } 


    public function withValidator(Validator $validator) 
    { 


     $email = $this->request->get('email'); // Start with 

     $user = \App\User::Where('email', $email)->first(); 


     if($user && $user->activated == 0){ 

      $row = \App\User::find($user->id); 
      $row->delete(); 

     }else{ 

      $validator->sometimes('email', 'unique:users', function ($input) { 
       return true; 
      }); 
     } 


    } 

} 

次は私が作成されたカスタムルールオブジェクトです:

<?php 

namespace App\Rules; 

use Illuminate\Contracts\Validation\Rule; 

class allAreSpaces implements Rule 
{ 
    /** 
    * Create a new rule instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     // 
    } 

    /** 
    * Determine if the validation rule passes. 
    * 
    * @param string $attribute 
    * @param mixed $value 
    * @return bool 
    */ 
    public function passes($attribute, $value) 
    { 

     if(strlen($value) > 0){ 
      if (strlen(trim($value)) == 0){ 
       return false; 
      } 
     } 
     return true; 

    } 

    /** 
    * Get the validation error message. 
    * 
    * @return string 
    */ 
    public function message() 
    { 
     return 'Password cannot contain space character alone'; 
    } 
} 

最初のは、「パスワードだけでは空白文字を含めることはできません」、帰国します。しかし、私はいくつかのスペースを入力し、それを提出すると、 'パスワードは空ではありません'と表示されます。しかし、タイプされた文字がスペースだけであれば、「パスワードはスペース文字だけを含むことはできません」としたい。

私は次のコードを使用しましたが、入力にスペースがある場合は表示されず、代わりに「パスワードは空ではありません」と表示されます。

public function passes($attribute, $value) 
    { 
     return false; 

    } 

私はなぜそれが不思議でしたか?

答えて

0

あなたのHTTPカーネルで設定されているアプリケーション内のすべてのルートで実行されているグローバルミドルウェアをチェックしましたか?これらは、遊びに来るかもしれない:

「デフォルトでは、Laravelはアプリケーションのグローバルなミドルウェア・スタック内のTrimStringsConvertEmptyStringsToNullミドルウェアを含み、これらのミドルウェアはApp\Http\Kernelクラスでスタックに記載されているこれらのミドルウェアは自動的にすべての着信文字列をトリミングします。フィールドの値をnullに変換するだけでなく、ルートとコントローラのこれらの正規化の懸念を気にする必要はありません。

この動作を無効にしたい場合は、アプリケーションのミドルウェアスタックの2つのミドルウェアをから削除してあなたのApp\Http\Kernelクラスのプロパティ。

Laravel 5.5 Docs - Requests - Input trimming and normalization

これは、同様に関連するかもしれない、なぜならこれらのミドルウェアで起こることができ、いくつかの合併症に入る:

「デフォルトでは、Laravelはアプリケーションの中TrimStringsConvertEmptyStringsToNullミドルウェアを含みこれらのミドルウェアはApp\Http\Kernelクラスによってスタックにリストされます。このため、バリデータを考慮したくない場合は、「オプション」のリクエストフィールドをnullableとしなければならないことがよくありますder nullの値が無効です。 「

Laravel 5.5 Docs - Validation - A note on optional fields

+0

私は、単一のルートの 'TrimStrings'と' ConvertEmptyStringsToNull'を削除することができます任意の方法はありますか? –

+0

そのアプリケーション空間で 'TrimStrings'ミドルウェアのための' except'配列があります'password'と' password_confirm'が入っていなければなりません...もしそれが他のことができるのであれば – lagbox

+0

'password'と 'password_confirm'がすでに入っています。 –

関連する問題