验证失败后 FormRequest 不填充 $request->old()
FormRequest not populating $request->old() after validation failure
当表单验证失败时,我的请求对象没有接收到 old() 数据。我收到了错误消息,但是 none 的旧输入数据。
我已经阅读了一些关于类似问题的解决方案,这些解决方案参考了对控制器上的重定向进行更改,但这并不能解决这个问题,因为重定向是由 FormRequest [=47 中下面引用的函数完成的=] 而不是控制器。
有没有其他人遇到过同样的问题?当我阅读一些引用现有错误的论坛时,我已经升级了我的实例,但问题仍然存在。
如有任何帮助,我们将不胜感激。
版本: 我已经在 laravel 5.4、5.7 和 5.8 上尝试过,其中 none 正在渲染旧数据。
我如何进行请求验证
验证是通过扩展 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 class 完成的。
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
]
}
在视图中转储旧的()参数returns一个空数组
[]
验证后,您应该检查所有验证是否通过。在控制器的方法中你可以这样做,
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
$messages = $validator->errors()->getMessages();
return back()
->withErrors($messages)
->withInput();
}
希望这对您有所帮助:)
我找到了这个问题的解决方案,并认为我会分享它,以防它帮助那些绞尽脑汁试图解决类似问题的人。
我有一个名为 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() 包含预期的数据。
当表单验证失败时,我的请求对象没有接收到 old() 数据。我收到了错误消息,但是 none 的旧输入数据。
我已经阅读了一些关于类似问题的解决方案,这些解决方案参考了对控制器上的重定向进行更改,但这并不能解决这个问题,因为重定向是由 FormRequest [=47 中下面引用的函数完成的=] 而不是控制器。
有没有其他人遇到过同样的问题?当我阅读一些引用现有错误的论坛时,我已经升级了我的实例,但问题仍然存在。
如有任何帮助,我们将不胜感激。
版本: 我已经在 laravel 5.4、5.7 和 5.8 上尝试过,其中 none 正在渲染旧数据。
我如何进行请求验证 验证是通过扩展 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 class 完成的。
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
]
}
在视图中转储旧的()参数returns一个空数组 []
验证后,您应该检查所有验证是否通过。在控制器的方法中你可以这样做,
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
$messages = $validator->errors()->getMessages();
return back()
->withErrors($messages)
->withInput();
}
希望这对您有所帮助:)
我找到了这个问题的解决方案,并认为我会分享它,以防它帮助那些绞尽脑汁试图解决类似问题的人。
我有一个名为 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() 包含预期的数据。