2017-10-06 15 views
1

複数の値で1つの入力を検証するにはどうすればよいですか?私はブートストラップのtagsinputプラグインを使用しています。 1つのフィールドにすべてのタグを返します。私はこのタグを検証する必要があります。 まず、このタグを配列に配置して要求に応じて検証しますが、まだ運がないかどうかを確認しようとしています。ここ は、要求の中に私のコードです:ラーバル検証 - コンマ区切りの文字列を配列として入力

public function all() 
{ 
    $postData = parent::all(); 

    // checkbox status 
    if(array_key_exists('keywords', $postData)) { 

     // put keywords into array 
     $keywords = explode(',', $postData['keywords']); 

     $test = []; 
     $i = 0; 
     foreach($keywords as $keyword) 
     { 
      $test[$i] = $keyword; 
      $i++; 
     } 
     $postData['keywords'] = $test; 

    } 

    return $postData; 

} 

public function rules() 
{ 
    $rules = [ 
     'title' => 'required|min:3|unique:subdomain_categories,title|unique:subdomain_keywords,keyword', 
     'description' => '', 
     'image' => 'required|image', 
     'keywords.*' => 'min:3' 
    ]; 

    return $rules; 
} 

しかし、すぐにキーワードが無効になるように私はこのエラーを取得する:helpers.phpライン531で

ErrorException: にhtmlentities()は、パラメータ1が文字列であることを期待します配列を指定します。

何か問題がありますか?

答えて

1

フィールドを検証するためにall()メソッドをオーバーライドすることは良い習慣ではありません。

コンマで区切られたStringを受け取り、検証する配列ではありませんが、利用可能な共通メソッドがない場合は、独自の配列を記述します。あなたのApp/Providers/ValidatorServiceProvider

はちょうど新しい検証追加します。必要に応じて

public function boot() 
{ 
    Validator::extend('keywords', function ($attribute, $value, $parameters, $validator) 
    { 
     // put keywords into array 
     $keywords = explode(',', $value); 

     foreach($keywords as $keyword) 
     { 
      // do validation logic 
      if(strlen($keyword) < 3) 
      { 
       return false; 
      } 
     } 

     return true; 
    } 
} 

今、あなたはすべての要求に、この検証ルールを使用することができますが、それは、再利用可能です。

public function rules() 
{ 
    $rules = [ 
     'title'  => 'required|min:3|unique:subdomain_categories,title|unique:subdomain_keywords,keyword', 
     'description' => 'nullable', 
     'image'  => 'required|image', 
     'keywords' => 'keywords', 
    ]; 

    return $rules; 
} 

検証合格した場合、あなたはキーワードは、配列としてあなたの要求でアクセスできるように、独自のメソッドを書くようにしたい:

public function keywords() 
{ 
    return explode(',', $this->get('keywords')); 
} 
+0

これはうまくいきません... 私が試してみると奇妙です:dd($ this-> request-> get( 'keywords')); "アイテム1、アイテム2"をダンプします。キーワードが配列に変更されていないようです – general666

+0

'$ this-> request-> get( 'keywords')の内容はkey => valueの値を持つ配列かカンマで区切られた文字列です – Webdesigner

+0

コンマで区切られています文字列... – general666

0

コンマは上の電子メールを分離して、私は同様の問題に実行していました5.4。

リクエストクラスでは、prepareForValidation()メソッド(デフォルトでは何も実行しない、btw)を上書きし、コンマ区切り文字列を分解します。

/** 
* @inheritDoc 
*/ 
protected function prepareForValidation() 
{ 
    $this->replace(['keywords' => explode(',', $this->keywords)]); 
} 

これでLaravelの通常のarray validationを使用できます。

私のケースでは、メッセージについてさらに明示する必要があったため、属性とメッセージのカスタマイズも追加しました。私はa gistを作ったのですが、これもあなたに興味があれば

関連する問題