Я работаю в Laravel 5.4, и у меня есть несколько специфических правил проверки, но я думаю, что это должно быть легко выполнимо без расширения класса. Просто не уверен, как это сделать.
То, что я хотел бы сделать, – сделать поле формы 'music_instrument'
обязательным, если в массиве program
содержится 'Music'
.
Я нашел эту ветку. Как установить, нужно ли значение выбрать в другом поле множественного выбора в валидации laravel? но это не решение (потому что оно никогда не было разрешено в первую очередь), и причина, по которой он не работает, заключается в том, что представленные индексы массива не являются постоянными (не выбранные флажки не учитываются при индексировании результата представления. ..)
Мое дело выглядит так:
<form action="" method="post"> <fieldset> <input name="program[]" value="Anthropology" type="checkbox">Anthropology <input name="program[]" value="Biology" type="checkbox">Biology <input name="program[]" value="Chemistry" type="checkbox">Chemistry <input name="program[]" value="Music" type="checkbox">Music <input name="program[]" value="Philosophy" type="checkbox">Philosophy <input name="program[]" value="Zombies" type="checkbox">Zombies <input name="music_instrument" type="text" value""> <button type="submit">Submit</button> </fieldset> </form>
Если я выберу некоторые из параметров из списка флажков, я могу потенциально получить этот результат в моих значениях $request
[program] => Array ( [0] => Anthropology [1] => Biology [2] => Music [3] => Philosophy ) [music_instrument] => 'Guitar'
Глядя на правила проверки здесь: https://laravel.com/docs/5.4/validation#available-validation-rules Я думаю, что что-то вроде его должно работать, но я буквально ничего не получаю:
$validator = Validator::make($request->all(),[ 'program' => 'required', 'music_instrument' => 'required_if:program,in:Music' ]);
Я надеялся, что это тоже сработает, но не повезло:
'music_instrument' => 'required_if:program,in_array:Music',
Мысли? Предложения?
Спасибо!
Не пробовал это, но в общих полях массива вы обычно пишете вот так: program.*
, Возможно, что-то вроде этого будет работать:
$validator = Validator::make($request->all(),[ 'program' => 'required', 'music_instrument' => 'required_if:program.*,in:Music' ]);
Если это не сработает, очевидно, вы можете сделать это и другим способом, например:
$rules = ['program' => 'required']; if (in_array('Music', $request->input('program', []))) { $rules['music_instrument'] = 'required'; } $validator = Validator::make($request->all(), $rules);
Подход, который я использовал для подобной проблемы, заключался в том, чтобы сделать частную функцию внутри моего класса Controller и использовать трехмерное выражение, чтобы добавить требуемое поле, если оно вернулось true.
У меня есть примерно 20 полей, у которых есть флажок, чтобы включить поля ввода в этом случае, поэтому он может быть излишним в сравнении, но по мере роста ваших потребностей он может оказаться полезным.
/** * Check if the parameterized value is in the submitted list of programs * * @param Request $request * @param string $value */ private function _checkProgram(Request $request, string $value) { if ($request->has('program')) { return in_array($value, $request->input('program')); } return false; }
Используя эту функцию, вы можете применить ту же логику, если у вас есть другие поля для других ваших программ.
Затем в функции магазина:
public function store(Request $request) { $this->validate(request(), [ // ... your other validation here 'music_instrument' => ''.($this->_checkProgram($request, 'music') ? 'required' : '').'', // or if you have some other validation like max value, just remember to add the |-delimiter: 'music_instrument' => 'max:64'.($this->_checkProgram($request, 'music') ? '|required' : '').'', ]); // rest of your store function }