2016-12-02 6 views
1

Позвольте мне описать мой сценарий. Вот форма похожа на мою:Пользовательский валидатор Laravel 4.2 для объединения required_if OR required_without

<select name="colors"> 
    <option value="1">Dark red</option> 
    <option value="2">Light red</option> 
    <option value="3">Dark green</option> 
    <option value="4">Light green</option> 
</select> 
<input type="text" name="textbox-field"> 
<input type="checkbox" name="checkbox-field" value="1"> 

Я хотел бы подтвердить textbox-field ИЛИ checkbox-field, на основании которого выбирается значение на colors. Проблема заключается в том, что textbox-field и checkbox-field являются взаимоисключающими, что означает, что только один из них должен быть заполнен, когда заданы значения colors.

Если бы я имел одно поле я мог бы просто использовать встроенный в правиле required_if, как это:

'textbox-field' => "string|required_if:colors,3,4" 

Однако то, что я хочу достигнуть, somethink как это, но с оператором ИЛИ между двумя последними правилами :

'textbox-field' => "string|required_if:colors,3,4|required_without:checkbox-field" 
'checkbox-field' => "numeric|required_if:colors,3,4|required_without:textbox-field" 

можно ли создать правило проверки пользовательских который будет сочетать в себе required_if и required_without с помощью ИЛИ логического оператора?

+0

AS Я знаю правила в сочетании с и, поэтому вы можете написать свое собственное правило правильности. – mcklayin

+0

Это правда, любая помощь в том, как я могу реализовать пользовательскую проверку для этого случая? Можно ли использовать встроенные правила проверки внутри пользовательского? – LePhleg

+0

Чтобы ответить на мои собственные вопросы сверху, да, можно использовать встроенные правила внутри нового настраиваемого валидатора, если он реализован внутри класса, который расширяет 'Illuminate \ Validation \ Validator'. Таким образом, он будет иметь доступ к защищенным функциям, которые реализуют все встроенные правила, такие как 'validateRequiredIf()' и 'validateRequiredWithout'. Проверьте приведенный ниже код для конкретного примера. – LePhleg

ответ

0

я был в состоянии понять это, путем осуществления следующего пользовательского валидатора:

/** 
* Class CustomValidator 
* Extends the Illuminate\Validation\Validator class instead of using Validator::extend, 
* it requires access to protected properties of the Validator parent class 
* 
* Note: This needs to be registered in app/start/global.php 
*/ 
class CustomValidator extends Illuminate\Validation\Validator 
{ 

/** 
* The validation rules that imply the field is required. 
* 
* @var array 
*/ 
protected $implicitRules = array(
    'Required', 
    'RequiredWith', 
    'RequiredWithAll', 
    'RequiredWithout', 
    'RequiredWithoutAll', 
    'RequiredIf', 
    'Accepted', 
    'RequiredIfValueSelectedOrWithoutField' 
); 
/** 
* Validate mutually exclusive fields when specific options have been selected in select input 
* This uses the built-in rules and apply them using the OR logical operator 
* 
* @param $attribute 
* @param $value 
* @param $parameters 
* 
* @return bool 
*/ 
public function validateRequiredIfValueSelectedOrWithoutField($attribute, $value, $parameters) { 

    // use the required_if bult-in rule to check if the required options are selected in select input 
    $valueSelectedParams = array_merge(['my_select_input'],Model::getArrayWithTheSpecifiedOptions()); 
    $isValidForSelect = $this->validateRequiredIf($attribute, $value, $valueSelectedParams); 

    // use the required_without to check if the mutually exclusive field in parameters[0] has a value 
    $isValidForMutualExclusiveField = $this->validateRequiredWithout($attribute, $value, [$parameters[0]]); 

    // returns the result by applying OR between the required_if and the required_without rules 
    return ($isValidForSelect || $isValidForMutualExclusiveField); 
} 

/** 
* Replace the :other placeholder with the select input localized literal to display correctly in error messages 
* 
* @param $message 
* 
* @return mixed 
*/ 
protected function replaceDangerousEkaOrField($message) 
{ 
    return str_replace(':other', Lang::get('model.my_select_input'), $message); 
} 

Я поместил это в app/helpers/CustomValidator.php и зарегистрировал его в конце моей app/start/global.php:

/* 
|-------------------------------------------------------------------------- 
| Register Custom Validator extending Illuminate\Validation\Validator 
|-------------------------------------------------------------------------- 
*/ 

Validator::resolver(function($translator, $data, $rules, $messages) 
{ 
    return new CustomValidator($translator, $data, $rules, $messages); 
}); 

Он также требуется для запуска composer dump-autoload, чтобы добавить новый класс в classloader.

Я надеюсь, что это поможет любому, кто находится в подобном положении в будущем. Ура!

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