【问题标题】:FormRequest not populating $request->old() after validation failure验证失败后 FormRequest 不填充 $request->old()
【发布时间】:2019-08-26 05:34:20
【问题描述】:

当表单验证失败时,我的请求对象没有收到 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 中进行重定向和验证 重定向是通过 Laravel 标准 FormRequest 类完成的。

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

验证器响应: 这是我在 vardump 上述函数时看到的。它确实有我的表单数据。

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
  ]
}

在视图中转储 old() 参数会返回一个空数组 []

【问题讨论】:

    标签: php laravel laravel-request laravel-form


    【解决方案1】:

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

    $validator = Validator::make($request->all(), $rules);
    
    if ($validator->fails()) {
        $messages = $validator->errors()->getMessages();
        return back()
               ->withErrors($messages)
               ->withInput();
    }
    

    希望这会有所帮助:)

    【讨论】:

    • 很好的建议,但是,当您在 FormRequest 中失败时,控制器不会被访问。如前所述,验证发生在 FormRequests 中。你应该给 FormRequests 一个机会,它可以让你从你的控制器中减少这样的代码。
    【解决方案2】:

    我找到了解决方案,并认为我会分享它,以防它帮助任何人绞尽脑汁试图解决类似问题。

    我有一个名为 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() 包含预期的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多