Intereting Posts
PHP: данные двоичного изображения, проверка типа изображения Почему метод Auth :: try всегда возвращает false? Столбец бит MySql возвращает странное большое число в PHP 7.1 (не в предыдущих версиях) Как пройти путь динамического изображения в Твиттере? Почему mb_ereg () не обнаруживает арабские символы? Предупреждение: mysql_result () : невозможно перейти к строке 0 по индексу результата MySQL 5 в файле profile.php в строке 11 cakephp в одной форме, несколько моделей, не отображая сообщения проверки модели Изображение водяного знака в php Анонимные функции в ловушках WordPress Предотвращение вставки кода загрузки изображения Как получить цену приложения в Steam WebAPI? 100% безопасный сценарий загрузки фотографий Как отлаживать запросы AJAX? Как узнать, какая функция PHP вызывается? Зачем использовать шаблонный движок с каркасом? Мое приложение zend не может загружать файлы на youtube

Правила валидации Laravel, если значение существует в другом массиве полей

Я работаю в 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 }