2016-08-19 20 views
0

2つのフィールドが別の値に設定されている場合にのみ必要なフォームにフィールドがあります。これはrequired_with_allのケースではありません。 ITは設定されていなければ、それが具体的に設定されていればそれを示します。複数の他のフィールドの値を検証するカスタムLaravel 5バリデータを作成して使用する方法

例:'FOO' => 'required_if_all:バー、2、バット、1'

私は、サービスプロバイダを追加しました:

<?php namespace App\Providers; 

use Illuminate\Support\ServiceProvider; 
use Validator; 

class RequiredIfAllProvider extends ServiceProvider { 

/** 
* Bootstrap the application services. 
* 
* @return void 
*/ 
public function boot() 
{ 
    Validator::extend('required_if_all', function($attribute,$value,$parameters){ 

     // Is required if the list of key/value pairs are matching 
     $pairs = []; 
     foreach($parameters as $kp => $vp) $pairs[$kp] = $vp; 
     foreach($pairs as $kp => $vp) if(\Request::input($kp) != $vp) return false; 
     return true; 

    }); 
} 

/** 
* Register the application services. 
* 
* @return void 
*/ 
public function register() 
{ 
    // 
} 

} 

そして私はApp\Providers\RequiredIfAllProviderを使用してください;私のカスタムリクエストファイルの一番上にあります。

バリデーションに基づくパラメータに基づいてbarとbatの両方が設定されている場合は、新しいエラーをエラーバッグに追加する必要があります。

私はこれにかなり費やしました。何か案は?

+0

だけで、ログインコントローラを探します。 laravel 5以降では、私は彼らがあなたの必要な値などを追加するだけで 'auth'を 'trait'に移したと思います。 – Gokigooooks

+0

これはloginまたはauthとは関係ありません。目標は、サイト全体で利用可能な検証ルールです。 –

+0

申し訳ありませんが、私は検証に固執しました。とにかく、laravel 5.1では、独自の関数と変数のセットをコントローラに適用することができます。そこにあなたの検証を加えることができるので、どこにでも注入することができます。 – Gokigooooks

答えて

0
  1. は、providers下のリクエストクラスでそれを使用する必要がconfig\app.phpでのサービスプロバイダを登録しないで説明したように、あなたは、検証にrequired_with_allと、このようなを使用することができます。 (Docs/Registering Providers
  2. Inputファサードから他の属性を取得しないでください!これにより、バリデータの使用が大幅に制限され、奇妙なバグが発生する可能性があります。検証コールバックに渡される4番目のパラメータは、バリデータインスタンスです。バリデーターが現在検証しているすべてのデータを提供するメソッドgetData()があります。
  3. ルールは空の値でも実行する必要があるため、extendImplicit()メソッドでルールを登録する必要があります。 (Docs\Custom Validation Rules

未テストのコード例:

public function boot() 
{ 
    Validator::extendImplicit('required_if_all', function($attribute, $value, $parameters, $validator) { 
     // No further checks required if value is there 
     if ($value) { 
      return true; 
     } 

     // Convert $parameters into a named array with the attributes as keys 
     $n_pairs = floor(count($parameters)/2); 
     $pairs = []; 
     for ($i = 0; $i < $n_pairs; $i++) { 
      $pairs[$parameters[$i]] = $parameters[$i+1]; 
     } 

     // Check if all pairs match with the input 
     $data = $validator->getData(); 
     foreach ($pairs as $key => $value) { 
      if ($data[$key] !== $value) { 
       // If at least one pair does not match, the rule is always true 
       return true; 
      } 
     } 

     // All pairs match, now $value has to be set 
     return !!$value; 
    }); 
} 
0

the docsで説明されているフォームリクエストを使用することをお勧めします。

そしてhere

+0

L5ではなく5.1を使用します。私もこれにカスタムフォーム要求を使用しています。この場合、Required_with_allは機能しません。 –

関連する問題