FormRequest не заполняет $ request- ›old () после ошибки проверки

Мой объект запроса не получает данные old (), когда форма не проходит проверку. Я получаю сообщения об ошибках, но старые входные данные отсутствуют.

Я прочитал несколько решений по аналогичным вопросам, которые касаются внесения изменений в перенаправление на контроллере, но это не решит эту проблему, потому что перенаправление выполняется функцией, указанной ниже в классе FormRequest, а не контроллером.

Кто-нибудь еще сталкивался с этой же проблемой? Я обновил свой экземпляр, прочитав несколько форумов, в которых упоминались существующие ошибки, но проблема все еще существует.

Любая помощь будет оценена.

Версии. Я пробовал это на laravel 5.4, 5.7 и 5.8, и ни один из них не отображает старые данные.

Как я выполняю проверку запросов. Проверка выполняется с помощью стандартного файла запросов, расширяющего FormRequest.

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class CustomerManagementRequest extends FormRequest {
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize() {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules() {
        return [
            'first_name' => 'required|min:2',
            'last_name' => 'required|min:2',
            'email' => 'required|min:4',
        ];
    }

}

Как я пытаюсь получить доступ к старым данным в моем представлении

value="{{old('first_name')}}"

Перенаправление и проверка выполняются в FormRequest. Перенаправление выполняется с помощью стандартного класса FormRequest Laravel.

protected function failedValidation(Validator $validator)
{
    throw (new ValidationException($validator))
                ->errorBag($this->errorBag)
                ->redirectTo($this->getRedirectUrl());
}

Ответ валидатора: это то, что я вижу, когда пытаюсь выполнить указанную выше функцию. У него есть данные моей формы.

Validator {#629 ▼
  #data: array:11 [▼
    "_token" => "1ynKXxi551UBGbJq6ftLsW6VsClZzmbZdHiHIxyt"
    "active_from_date" => "04/04/2019 10:58 PM"
    "last_sync_date" => "04/04/2019 11:00 PM"
    "first_name" => "Pizza"
    "last_name" => "Dough"
    "email" => null
    "full_phone" => null
    "phone" => null
  ]
}

vardumping параметра old () в представлении возвращает пустой массив []


person Dom DaFonte    schedule 04.04.2019    source источник


Ответы (2)


После проверки вы должны проверить, пройдена ли проверка. В методе контроллера вы можете сделать это так:

$validator = Validator::make($request->all(), $rules);

if ($validator->fails()) {
    $messages = $validator->errors()->getMessages();
    return back()
           ->withErrors($messages)
           ->withInput();
}

Надеюсь это поможет :)

person Maulik Shah    schedule 04.04.2019
comment
Хорошее предложение, однако, к контроллеру не осуществляется доступ, когда вы терпите неудачу в FormRequest. Как уже упоминалось, проверка происходит в рамках FormRequests. Вы должны попробовать FormRequests, это позволит вам сократить код, подобный этому, с вашего контроллера. - person Dom DaFonte; 06.04.2019

Я нашел решение этой проблемы и подумал, что поделюсь им, если это поможет кому-то там ломать себе голову, пытаясь выяснить аналогичную проблему.

У меня было специальное промежуточное программное обеспечение под названием ViewData, в конце которого была команда session () -> save (), которая сохраняла за мигающие данные, что приводило к тому, что мой массив старых входных данных был пуст.

Вот как я это сделал для тех из вас, кто устраняет похожую проблему.

Сначала я попытался создать ручную проверку в своем контроллере, чтобы устранить проблему с FormRequest. Затем я проследил за валидатором до промежуточного программного обеспечения ShareErrorsFromSession в ядре.

Я понял, что у меня есть промежуточное программное обеспечение, которое запускается после этого промежуточного программного обеспечения (я называю его ViewData), и это промежуточное программное обеспечение хранит некоторые переменные для сеанса.

protected $middlewareGroups = [
        'web' => [

            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            //\Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\ViewData::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

Я пролистал и нашел сеанс () -> save (). Это сохранение сохранено по сравнению с работой, выполняемой withInput, по существу оставив старый пустой. Я удалил сеанс сохранения (поскольку он не представлял ценности), и теперь old () содержит ожидаемые данные.

person Dom DaFonte    schedule 05.04.2019