2017-02-18 18 views
1

У меня возникла проблема с правилами проверки вложенных условий.Правила валидации required_if с другим условием (Laravel 5.4)

class StoreRequest extends Request 
{ 
     public function authorize(){ 
     return true; 
     } 

     public function rules(){ 
       return [ 
        'type_id'  => 'required|integer', 
        'external_id' => 'required_if:type_id,==,3|integer', 
       ]; 
     } 
} 

Действительно я хочу: - проверить external_id только если type_id равно 3 - и проверить, если это целое число.

Когда я отправляю свою форму, правила работы, когда я выбираю TYPE_ID равное 3. Но если выбрать другой TYPE_ID, как 1 или 2, то проверка не проходит:

external_id должен быть целым числом.

Я пытаюсь добавить обнуляемое состояние, но required_if больше не работает

ли у вас есть какие-либо идеи?

ответ

2

Ваше правило выполняет две проверки, независимые друг от друга; просто потому, что поле external_id не требуется, если type_id! = 3, не означает, что проверка целых чисел игнорируется.

То, что вы ищете, это conditional rule, что дает вам более точное управление при выполнении проверки, например. :

$validator = Validator::make($data, [ 
    'type_id' => 'required|integer' 
]); 

$validator->sometimes('external_id', 'required|integer', function($input) { 
    return $input->type_id == 3; 
}); 

При использовании формы проверки, вы можете получить доступ к лежащему в основе экземпляра валидатора путем переопределения getValidatorInstance() метода:

class StoreRequest extends Request 
{ 
     public function authorize(){ 
     return true; 
     } 

     public function rules(){ 
       return [ 
        'type_id'  => 'required|integer' 
       ]; 
     } 

     protected function getValidatorInstance() { 
      $validator = parent::getValidatorInstance(); 
      $validator->sometimes('external_id', 'required|integer', function($input) { 
       return $input->type_id == 3; 
      }); 
      return $validator; 
     } 
} 
0

попробовать это,

class StoreRequest extends Request 
    { 
      public function authorize(){ 
      return true; 
      } 

      public function rules(){ 
        return [ 
         'type_id'  => 'required|integer', 
         'external_id' => 'required_if:type_id|in:3|integer', 
        ]; 
      } 
    } 
0

Просто наткнулся на такую ​​же проблему и нашел следующий ответ, который, как представляется, работает для меня:

issue-using-required-if-validation-rule-in-form-builder

 return [ 
       'type_id'  => 'required|integer', 
       'external_id' => 'required_if:type_id,==,3|nullable|integer', 
      ]; 

Результат для меня:

поле не заполняется, тип идентификатор не 3 - пройти

поле не заполняется, тип идентификатор 3 - сбой - обязательное поле

поле заселены , тип id 3, нецелое число - отказ в правиле целого

поле заполнено, тип id 3, целое число - pa ss - все хорошо!

примечание - думаю, что правило с нулевым значением указано в Laravel 5.3