验证失败后,FormRequest不填充$ request-> old()

时间:2019-04-04 12:44:14

标签: php laravel laravel-request laravel-form

当表单验证失败时,我的请求对象未接收到old()数据。我收到错误消息,但是没有旧的输入数据。

我已经阅读了一些有关类似问题的解决方案,这些解决方案参考了对控制器上的重定向进行更改的方法,但是并不能解决该问题,因为重定向是由下面在FormRequest类而不是Controller中引用的函数完成的。

其他人也遇到过同样的问题吗?在阅读一些引用了现有错误的论坛时,我已经升级了实例,但是问题仍然存在。

任何帮助将不胜感激。

版本:我已经在laravel 5.4、5.7和5.8上尝试过此方法,但它们都没有呈现旧数据。

我如何进行请求验证 验证是通过扩展FormRequest的标准Requests文件完成的。

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中完成重定向和验证 重定向是通过Laravel标准的FormRequest类完成的。

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()参数将返回一个空数组 []

2 个答案:

答案 0 :(得分:2)

验证后,您应该检查所有验证是否通过。在控制器的方法中,您可以这样做,

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

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

希望这会有所帮助:)

答案 1 :(得分:1)

我找到了解决方案,并认为我会分享它,以防万一有人想尽办法解决类似问题。

我有一个名为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,
        ],

我滚动浏览,发现一个session()-> save()。此保存节省了withInput所完成的工作,基本上保留了旧的为空。我删除了保存会话(因为它没有价值),现在old()包含了预期的数据。