В простейшем случае мне без проблем удается вынести валидацию в отдельный реквест. Однако в текущем методе контроллера на фронте у меня поля создаются динамически и их может быть произвольное количество, которое можно определить через параметр в запросе projectscounter. Чтобы проверить эти поля мне приходится сначала создавать их массив, а затем уже делать проверку на валидацию. причем дважды. Первый раз я проверяю валиден ли projectscounter, а затем использую его, чтобы сформировать в цикле остальные проверки. Как это вынести в отдельный реквест? Не хочу это видеть в контроллере. И вообще код некрасивый получился, может подскажете как бы вы сделали, чтобы придать ему более читабельный вид? Код (Text): public function writeReport(Request $request) { // Валидация и формирование списка параметров в массив $fieldsList $fieldsList = array(); $fieldsList['projectscounter'] = 'required|min:1|max:20'; $request->validate($fieldsList); for ($i = 1; $i<=$request -> projectscounter; $i++){ $fieldsList['projectname' . $i] = 'required'; $fieldsList['subprojectname' . $i] = 'required'; $fieldsList['reporttimeproject' . $i] = 'nullable|min:0|max:24|numeric'; $fieldsList['textareareport' . $i] = 'required|min:10|max:3000|string'; } $fieldsList['reporttimeproject'] = 'required|min:1|max:20|string'; $fieldsList['reportdate'] = 'required|date'; $fieldsList['reporttype'] = 'required|in:Рабочее время,Больничный,Отпуск,Отгул'; $request->validate($fieldsList);
А на валидацию массивов не заменить? И передавать всё в виде массивов из формы? Тогда не нужен будет projectscounter и будет меньше кода. https://laravel.com/docs/5.6/validation#validating-arrays Хотя, метод rules() твоего FormRequest может быть сколько угодно сложен, все поля тебе в нём уже доступны, просто проверь $this->get("projectscounter")
Да, валидация массивов выглядит гораздо лучше. Только наверное у меня js вырастет, чтобы передать данные массивом. Буду пробовать.
Да нет, не вырастит. Если js обычный, с jQuery и без всяких Angular, vue и прочего, то там всё просто получается. Я делаю примерно так: Код (HTML5): <script type='text/html' id='field-template'> <div class='field' data-num='##n##'> <input name='project-data[##n##][name]'> <!-- и т. д. --> </div> </script> <script> $("#addField").click(function () { var $lastField = $(".field-container .field:last"); var n = $lastField.length ? $lastField.data("num"): 0; var newFieldHtml = $("#field-template").text().replace(/##n##/g, n); $(".field-container").append(newFieldHtml); }); </script> Идея ясна, надеюсь. Ну а если есть VueJs или angular, то там даже проще, просто дополнительный пустой элемент в массив вставить.
опечатался, надо заменить строчку Код (Text): var n = $lastField.length ? $lastField.data("num") + 1: 0;