Laravel Validating Arrays - передать 2 параметра?

Мне нужно расширить валидатор laravel, создав новый валидатор, но проблема в том, что мне нужно передать 2 параметра, один для days и один для slots. Как это решить?

Пример 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)
   }
}

person I'll-Be-Back    schedule 16.11.2016    source источник


Ответы (2)


Это правильный метод создания пользовательской проверки Laravel.

Создайте собственного поставщика услуг проверки, используя

php artisan make:provider ValidationServiceProvider

затем перейдите к config\app.php и добавьте это к providers

App\Providers\ValidationServiceProvider::class

Теперь перейдите к ValidationServiceProvider.php и добавьте

use Validator;

наверх...

и это в функции 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'

Надеюсь это поможет :)

person prateekkathal    schedule 17.11.2016
comment
Как определить пользовательское сообщение об ошибке в Validator::extend? Каждое сообщение об ошибке должно иметь ключ слотов - person I'll-Be-Back; 17.11.2016
comment
Я хочу указать значение открытия и закрытия в сообщении об ошибке. - person I'll-Be-Back; 17.11.2016
comment
@I'll-Be-Back Извините за поздний ответ... Пожалуйста, отметьте меня в следующий раз, чтобы я знал... Меня почему-то не уведомили об этом. Вы можете добавить все расширенные сообщения проверки либо в глобальный список... resources/lang/validations.php, либо создать свой собственный валидатор (путем расширения Illuminate\Validation\Validator) и перезаписать функцию сообщений своей собственной... и использовать свой собственный валидатор... - person prateekkathal; 08.12.2016

Ну, это другой подход.

  1. В вашем AppServiceProvider добавьте свой собственный обработчик в методе 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. Наконец, примените правила. ЕСЛИ вам нужно отобразить ошибку, если хотя бы один слот закрыт, вы можете использовать это правило:

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

    Посмотрите, как я передаю days в качестве параметра. Кроме того, если вам нужно проверить каждый слот отдельно и отобразить сообщение для каждого из них, примените правило следующим образом:

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

Дополнительные документы:

person manix    schedule 17.11.2016
comment
В чем разница между Validator::resolver и Validator::extend ? - person I'll-Be-Back; 17.11.2016