2013-07-30 3 views
0

В функции «store» (POST) моего контроллера я хотел проверить правильное поле ввода. У меня есть поле listPrice, которое требуется ТОЛЬКО, если значение другого поля, vendor, находится в массиве. Массив поставщиков должен быть заполнен отдельным вызовом службы. Итак, мой вопрос заключается в два раза:Значение поля «require_if» Laravel содержится в массиве

  1. Как написать правило проверки требовать listPrice, если значение vendor «s содержится в массиве и
  2. Когда я заполнить массив поставщика? Будет ли он находиться внутри функции store() и запускаться каждый раз, когда вызывается эта функция? Правила проверки правильности находятся в частном массиве класса контроллера, поэтому это создается только после того, как я полагаю, а не каждый раз, когда вызывается функция store().

ответ

3

1. Это было бы довольно просто, если вы могли бы получить доступ к $ это [данных] от валидатора Laravel, но если вы используете только Validator :: продлить для пользовательского правила, я не верю тебе Можно. Вы также не сможете получить доступ к другим правилам проверки из своего правила, что может пригодиться здесь. Поэтому самым чистым, вероятно, будет расширение класса валидатора.

class CustomValidator extends Illuminate\Validation\Validator { 

    public function validateIfInVendorArray($attribute, $value, $parameters) 
    { 
    $other = $parameters[0]; 
    $vendor = $this->data[$other]; 

    //populate your array from your service call, then check if present 
    $vendorArray = your service call or wherever you have it; 

    //if in array, return the result of the Validator's validateRequired method, which we can access since it's protected in Validator   
    if (in_array($vendor,$vendorArray)) 
     return $this->validateRequired($attribute,$value); 

    //if it wasn't in the array, return true to pass validation even if it doesn't exist 
    return true; 
    } 
} 

Только не забудьте также register your custom validator resolver

Чтобы использовать правило, которое вы просто передать имя атрибута поля продавцов в качестве параметра.

2. Я думаю, это зависит от того, где требуется ваш массив, и как часто.

Если это требуется только для этой проверки, я бы сделал это в вашем пользовательском правиле проверки, чтобы избежать наложения большего количества работы на контроллер.

Лично я бы переместил правила проверки в пользовательский класс проверки, а затем вы могли бы иметь массив поставщика как поле этого настраиваемого валидатора. Таким образом, этот пользовательский класс валидатора будет служить сервисом для вашего контроллера, см. Пример https://tutsplus.com/lesson/validation-services/.

Я не испытал ни одного из этого сам, но я считаю, что он должен работать! Извините, если это не самое элегантное решение.

+0

Hi @pfrendly: Я следую вашему предложенному решению. Это хорошо, но стоит перед одной проблемой. Fox, если я использую его как: 'field_name' => 'required | if_in_vendor_array: vendor_field' Он работает, но 'field_name' => 'if_in_vendor_array: vendor_field' не работает ... что может быть причиной ? – dirtyhandsphp

Смежные вопросы