2016-11-16 10 views
1

新しいバリデーターを作成するlaravelバリデーターを拡張する必要がありますが、問題は、daysslotsの2つのパラメーターを渡す必要があることです。これを解決するには?Laravel検証配列 - 2つのパラメータを渡しますか?

dd($request->all)ダンプ:

array:2 [ 
    "days" => array:2 [ 
    0 => "1" // Mon 
    1 => "2" // Tue 
    ] 
    "slots" => array:2 [ 
    1 => array:2 [ 
     "open" => "09:00" 
     "close" => "11:30" 
    ] 
    2 => array:2 [ 
     "open" => "16:00" 
     "close" => "21:00" 
    ] 
    ] 
] 

それはdaysをループする必要があるとslotsに確認してください。

擬似コード、例:

foreach($days as $day) { 
    foreach($slots as $slot) 
    { 
     // Validation Logic for $day and $slot (open and close) 
    } 
} 

答えて

1

これは、カスタムLarを作成する正しい方法ですアヴェル検証

php artisan make:provider ValidationServiceProvider 

を使用して、独自の検証サービスプロバイダを作成し、[今すぐValidationServiceProvider.phpに行くと

use Validator; 
を追加 config\app.phpに移動し、 providers

App\Providers\ValidationServiceProvider::class 

にこれを追加

トップへ...boot()機能で

この

Validator::extend('days_with_slots', function($attribute, $value, $parameters, $validator) { 
    $slots = request()->get('slots'); 

    if(!is_array($slots)) return false; 

    foreach($days as $day) { 
    foreach($slots as $slot) { 
     if(empty($slot[$day]) || empty($slot[$day]['open'] || empty($slot[$day]['close']))) { 
     return false; 
     } 
    } 
    } 
}); 

最後に、あなたのルールで

$rules['slots'] = 'days_with_slots' 

これを使用します。また、そのためのカスタムメッセージを追加することができ、希望

$message['days_with_slots'] = 'Open and Close Timings are required for the days selected' 

を言いますこれは役に立ちます:)

+0

'Validator :: extend'にカスタムエラーメッセージを定義する方法はありますか?各エラーメッセージにはスロットキーが必要です –

+0

エラーメッセージにopenとcloseの値を入れたいと思います。 –

+0

@ I'll Be Backタグ:私は知っているので、私は次の時間にタグを付けてください...私は何らかの理由でこれについて通知されませんでした。すべての拡張検証メッセージをグローバルリスト... 'resources/lang/validations.php'に追加するか、独自のValidator(Illuminate \ Validation \ Validatorを拡張して)を作成し、メッセージ関数をあなた自身で上書きすることができます。あなた自身のバリデータを使用する... – prateekkathal

1

まあ、これは別のアプローチです。あなたのAppServiceProviderで

  1. boot()方法でカスタムハンドラを追加します

    \Validator::resolver(function($translator, $data, $rules, $messages) { 
        return new MyCustomValidator($translator, $data, $rules, $messages); 
    }); 
    
  2. リゾルバクラスを作成します。

    最後に
    class MyCustomValidator extends Illuminate\Validation\Validator; 
    { 
        public function validateSlotsInDays($attribute, $value, $parameters){ 
         $valid = false; 
         $days = \Request::input($parametros[0]); 
         $slots = $value; 
    
         foreach($days as $day) { 
          foreach($slots as $slot) { 
           // Validation Logic for $day and $slot (open and close) 
          } 
         } 
    
         return $valid; 
        } 
    
        public function validateSlot($attribute, $value, $parameters){ 
         $valid = false; 
         $days = \Request::input($parametros[0]); 
         $slot = $value; 
         foreach($days as $day) { 
          // do whatever here 
         } 
    
    
         return $valid; 
        } 
    
    } 
    
  3. 、ルールを適用します。私は、パラメータとしてdaysを渡していますか

    $rules = [ 
        'slots' => ['slots_in_days:days'], 
    ]; 
    

    を参照してください:少なくとも1つのスロットが近い場合は、ヨーヨーは、エラーを表示する必要がある場合は、このルールを使用することができます。

    $rules = [ 
        'slots.*' => ['slot:days'], 
    ]; 
    

Addionalドキュメント:

+0

'Validator :: resolver'と' Validator :: extend'の違いは何ですか? –

関連する問題