За последние 24 часа нас посетили 18296 программистов и 1581 робот. Сейчас ищут 1078 программистов ...

Хочу вынести валидацию из контроллера в отдельный реквест

Тема в разделе "Laravel", создана пользователем Сереганек, 20 авг 2018.

  1. Сереганек

    Сереганек Активный пользователь

    С нами с:
    18 янв 2017
    Сообщения:
    333
    Симпатии:
    27
    В простейшем случае мне без проблем удается вынести валидацию в отдельный реквест. Однако в текущем методе контроллера на фронте у меня поля создаются динамически и их может быть произвольное количество, которое можно определить через параметр в запросе projectscounter. Чтобы проверить эти поля мне приходится сначала создавать их массив, а затем уже делать проверку на валидацию. причем дважды. Первый раз я проверяю валиден ли projectscounter, а затем использую его, чтобы сформировать в цикле остальные проверки. Как это вынести в отдельный реквест? Не хочу это видеть в контроллере. И вообще код некрасивый получился, может подскажете как бы вы сделали, чтобы придать ему более читабельный вид?

    Код (Text):
    1. public function writeReport(Request $request) {
    2.  
    3.         // Валидация и формирование списка параметров в массив $fieldsList
    4.         $fieldsList = array();
    5.  
    6.         $fieldsList['projectscounter'] = 'required|min:1|max:20';
    7.         $request->validate($fieldsList);
    8.  
    9.         for ($i = 1; $i<=$request -> projectscounter; $i++){
    10.             $fieldsList['projectname' . $i] = 'required';
    11.             $fieldsList['subprojectname' . $i] = 'required';
    12.             $fieldsList['reporttimeproject' . $i] = 'nullable|min:0|max:24|numeric';
    13.             $fieldsList['textareareport' . $i] = 'required|min:10|max:3000|string';
    14.         }
    15.         $fieldsList['reporttimeproject'] = 'required|min:1|max:20|string';
    16.         $fieldsList['reportdate'] = 'required|date';
    17.         $fieldsList['reporttype'] = 'required|in:Рабочее время,Больничный,Отпуск,Отгул';
    18.  
    19.         $request->validate($fieldsList);
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    А на валидацию массивов не заменить? И передавать всё в виде массивов из формы? Тогда не нужен будет projectscounter и будет меньше кода. https://laravel.com/docs/5.6/validation#validating-arrays

    Хотя, метод rules() твоего FormRequest может быть сколько угодно сложен, все поля тебе в нём уже доступны, просто проверь $this->get("projectscounter")
     
    Сереганек нравится это.
  3. Сереганек

    Сереганек Активный пользователь

    С нами с:
    18 янв 2017
    Сообщения:
    333
    Симпатии:
    27
    Да, валидация массивов выглядит гораздо лучше. Только наверное у меня js вырастет, чтобы передать данные массивом. Буду пробовать.
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Да нет, не вырастит. Если js обычный, с jQuery и без всяких Angular, vue и прочего, то там всё просто получается. Я делаю примерно так:
    Код (HTML5):
    1. <script type='text/html' id='field-template'>
    2. <div class='field' data-num='##n##'>
    3.    <input name='project-data[##n##][name]'>
    4.    <!-- и т. д. -->
    5. </div>
    6. $("#addField").click(function () {
    7.     var $lastField = $(".field-container .field:last");
    8.     var n = $lastField.length ? $lastField.data("num"): 0;
    9.     var newFieldHtml = $("#field-template").text().replace(/##n##/g, n);
    10.      $(".field-container").append(newFieldHtml);
    11. });
    Идея ясна, надеюсь. Ну а если есть VueJs или angular, то там даже проще, просто дополнительный пустой элемент в массив вставить.
     
    Сереганек нравится это.
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    опечатался, надо заменить строчку
    Код (Text):
    1.     var n = $lastField.length ? $lastField.data("num") + 1: 0;
     
    Сереганек нравится это.