2016-11-22 15 views
1

Requestでは、typeフィールドがreviewになります。つまり、bodyフィールドは6文字以上でなければなりません。Laravel 5.3 - 検証規則の最小値とrequired_ifの問題

public function rules(){ 
    return [ 
     'type' => 'required|in:star_rating,review', 
     'body' => 'required_if:type,review|min:6' 
    ]; 
} 

しかし、問題はtypestar_ratingときの体はオプションであり、必要とmin:6type場合で検証しなければならないため、私は、The body must be at least 6 characters.

これは起こるべきではないというエラーが出るということですreviewです。 typestar_ratingであっても、なぜそれがmin:6検証を実行するのかわかりません。

意図どおりに動作させるにはどうすればよいですか?

+0

で働くRequestでconditionnalルールを持つ別の解決策は、私はそれが原因 'required_if'だけ_not_' min'ルールに、 'required'ルールを適用するだろうと仮定します。 'required'が適用されない' min'ルールも無視しようとしているようです。ルールを条件付きで追加する(https://laravel.com/docs/5.3/validation#conditionally-adding-rules)を探している可能性があります。これにより、条件がtrueのときに '時には'を定義することができます。上記のリンクの 'closure'ベースのバリデーションをチェックして、必要なものを処理します! – camelCase

+0

リンクのコードを 'authorize'と' rules'という2つの標準関数を持つ 'Request'にどのように統合するのかちょっと混乱しています。それを' Request'に正しく統合する方法はありますか? – Wonka

+0

コメントを入力するのに役立つ回答を追加しました。それが役に立てば幸い! – camelCase

答えて

1

あなたのロジックの詳細を見ることなく、私はあなたがどのように進んでいくかを特定できません。しかし、以下のコンセプトは、あなたを動かすはずです。

conditionally adds rulesあなたが定義したパラメータに従って。あなたのケースでは、typereviewの場合はbodyが必要で、typereviewの場合は、6文字のminルールも適用されます。

use Validator; 

// Static rules that don't change 
$v = Validator::make($data, [ 
    'type' => 'required|in:star_rating,review' 
]); 

// Conditional rules that do change 
$v->sometimes('body', 'required|min:6', function ($input) { 
    return $input->type === 'review'; 
}); 

// Validator failed? Return back with errors/input 
if ($validator->fails()) { 
    return back()->withErrors($validator) 
       ->withInput(); 
} 

// Proceed however you'd like with request 
+0

完璧に動作します、ありがとう! – Wonka

+0

こんにちは、私はまったく同じ問題(laravel 5.4)を持っていますが、ドキュメントと答えの両方で理解できないことは次のとおりです。 FormRequestファイルにありますか? Wonkaが言っているように、それは 'authorise'の' rules'の2つのメソッドしかなく、私はこれらのメソッドの1つでこれを実装する方法を得ません。 これは私のコントローラにありますか?はいの場合、コントローラにリファクタリングして検証プロセスをリクエストに入れると少し迷惑です。 – Poch

0

私も同じ問題があり、CamelCaseの答えはうまくいきます! しかし、この検証ロジックをRequestに入れようとして、私の検証ロジックをコントローラに戻さなければなりませんでした。

だからここLaravel 5.4

public function rules() 
    { 
     // general rules 
     $rules = [ 
      'type' => 'required|in:star_rating,review',     
     ]; 

     // conditional rules 
     if($this->input('type') == 'review'){ 
      $rules['body'] = 'required | min:6'; 
     } 

     return $rules; 
    } 
関連する問題