LINUX.ORG.RU

Как запустить Validator так, чтобы он повторно вызывал запрос со старыми данными?

 , ,


0

1

Laravel 5.5

Для проверки ввода я пытаюсь использовать такой код:

public function addNotifyChannelApply(Request $request) {

  // Правила валидации
  $validator = Validator::make($request->all(), [
              'channelTypeId' => 'required|integer',
              'notifyChannelValue' => 'required|regex:/^(\d{4})$/',
          ]);

  // Дополнительная проверка
  $validator->after(function ($validator) use ($channelTypeId, $channelValue) {
    // Тут всякий проверяющий код            
  });
        
  // Запуск валидации на проверку
  $validator->validate();
  ...


Проблема в том, что валидатор, в случае обнаружения ошибок ввода, делает вызов предыдущего запроса, но не передает ему предыдущие Request данные. То есть old-данные передает, а вот именно предыдущие Request-данные не передает.

В результате контроллер отрабатывает неправильно, потому что не получает нужные Request-данные, они теряются.

Вроде как можно использовать конструкцию withInput( Array ), но у инстанса объекта Validator нет такого метода. Поэтому попробовал вместо $validator->validate(); написать:

if ($validator->fails()) {
  return redirect()->back()->withInput($request->all());
}


Но и так, все равно, данные предыдущего Request не приходят в метод контроллера. Сижу и думаю, почему так.

(!) Единственное, что я заметил, так это то, что повторный запрос, генерируемый валидатором, почему-то приходит через метод GET. И у этого запроса, естественно, нет раздела Form Data, в котором были бы видны повторно передаваемые данные формы. Видимо из-за этого теряются переменные POST.

Начал искать, с какого перепугу Validator генерирует GET-запрос вместо POST, ничего не нахожу.

В общем, не получается у меня сделать так, чтобы Validetor генерировал правильный запрос со старыми данными. Как решить эту проблему?

★★★★★

Тще, «генерация» ПОСТ запроса возможна только на стороне клиента. Бекенд никак не может сделать авто-ПОСТ-редирект. Ну, чисто технически, конечно, можно, но это никак не будет привязано к клиенту.

Теперь конкретно по твоей проблеме — сохраняй полученные ПОСТ-данные в сторадж (сессия, БД, мемкеш, редис). Оттуда в нужный момент и доставай, но и удаляй в нужный, иначе получишь старые данные из кеша при новом ПОСТ-запросе от клиента.

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

Теперь конкретно по твоей проблеме — сохраняй полученные ПОСТ-данные в сторадж (сессия, БД, мемкеш, редис). Оттуда в нужный момент и доставай, но и удаляй в нужный, иначе получишь старые данные из кеша при новом ПОСТ-запросе от клиента.

Это как-то странно. Простая же вещь - валидация данных. Нужно открыть ту же форму с теми же параметрами, но с заполненными данными old и errors. Неужели это нужно делать ТАК?

Xintrea ★★★★★ ()
Ответ на: комментарий от deep-purple

И вообще, почему тогда допустима конструкция:

redirect()->back()->withInput()

Ведь она предполагает, что данные withInput() каким-то образом будут передаваться. Но они не передаются, даже в строке GET-запроса.

Зачем на сервере нужен метод withInput(), если через GET он ничего не передает, а POST на сервере не может отправиться?

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

если через GET он ничего не передает, а POST на сервере не может отправиться?

Оно по-моему через сессию передает. Открывай исходники соответствующих функций, и разбирайся, где что пошло не так.

goingUp ★★★★★ ()
Ответ на: комментарий от goingUp

Оно по-моему через сессию передает. Открывай исходники соответствующих функций, и разбирайся, где что пошло не так.

Пофигу как передает. Если вызвали редирект с withInput(), значит эти данные должны быть подмешаны в параметр Request $request вызываемого контроллера.

Но их там нет.

Xintrea ★★★★★ ()
Ответ на: комментарий от goingUp

Блин, разобрался.

Я то думал, что withInput() будет помещать данные во входящий параметр контроллера Request $request.

А их надо доставать через old('Имя параметра').

Поэтому в контроллере повторно вызываемого действия надо получать параметры примерно так:

public function addChannelDialog(Request $request) {

  $channelTypeId = $request->input('channelTypeId') ?? old('channelTypeId');

Xintrea ★★★★★ ()
Ответ на: комментарий от goingUp

В данном случае не получится, потому что форме, о которой идет речь в топике, предшествует форма с разными настройками. На основании этих настроек контроллер производит вычисления и генерирует данные для текущей формы. Поэтому эти настройки и нужно таскать между запросами, например при повторном запросе если валидация не прошла.

Xintrea ★★★★★ ()
Последнее исправление: Xintrea (всего исправлений: 1)