📅  最后修改于: 2023-12-03 15:24:38.914000             🧑  作者: Mango
在 Laravel 中,我们经常需要在表单验证失败时,将错误信息返回给前端,并且保留用户已经填写的表单内容。在某些情况下,我们可能想要在这个基础上再做一些额外的处理,比如在旧值中设置条件值,或者使用验证编辑新值。
以下是实现以上需求的一些方法。
在表单验证失败后,Laravel 会自动将用户填写的表单内容保存在 old()
中。这个方法会返回一个关联数组,数组的键为表单元素的 name 属性,值为用户填写的表单值。我们可以在这个数组中添加一些条件字段,然后将其返回给前端。
在控制器中,我们可以使用 withInput()
方法将旧值保存在闪存中,然后使用 withErrors()
方法将验证错误信息存入闪存。最后使用 redirect()
方法将用户重定向回之前的页面,并在视图中读取闪存数据,以显示错误信息和保留用户已经填写的表单内容。
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:8|confirmed',
]);
if ($validator->fails()) {
return redirect()
->back()
->withInput(['condition' => 'value'])
->withErrors($validator);
}
// ...
}
在视图中,我们可以使用 old()
方法读取旧值中的数据,并为其添加一些条件值。在下面的例子中,我们为 name 字段设置了一个条件值,如果 name 字段为空则使用默认值。
<form method="POST" action="/example">
@csrf
<div>
<label for="name">Name</label>
<input type="text" name="name" value="{{ old('name', 'default') }}">
</div>
<div>
<label for="email">Email</label>
<input type="email" name="email" value="{{ old('email') }}">
</div>
<div>
<label for="password">Password</label>
<input type="password" name="password">
</div>
<div>
<label for="password_confirmation">Confirm Password</label>
<input type="password" name="password_confirmation">
</div>
<button type="submit">Submit</button>
</form>
在某些情况下,我们可能需要在验证失败后,将表单中的值重新编辑并保存,让用户修正错误后再次提交表单。为了达到这个目的,我们可以使用 old()
方法和表单的 value
属性,将编辑后的值回显到表单中。
在控制器中,我们可以使用 Validator
的 after()
方法,在表单验证之后回调一个自定义函数。在这个函数中,我们可以获得 $validator
对象和请求 $request
对象,然后使用它们来编辑表单的值。
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:8|confirmed',
]);
$validator->after(function ($validator) use ($request) {
$validator->setData(['name' => strtoupper($request->input('name'))]);
});
if ($validator->fails()) {
return redirect()
->back()
->withErrors($validator)
->withInput();
}
// ...
}
在视图中,我们可以使用表单的 value
属性和 old()
方法来回显表单的值。在以下例子中,我们将会将 name
字段的值全部转为大写,并在表单中回显。
<form method="POST" action="/example">
@csrf
<div>
<label for="name">Name</label>
<input type="text" name="name" value="{{ old('name', strtoupper($request->input('name'))) }}">
</div>
<div>
<label for="email">Email</label>
<input type="email" name="email" value="{{ old('email') }}">
</div>
<div>
<label for="password">Password</label>
<input type="password" name="password">
</div>
<div>
<label for="password_confirmation">Confirm Password</label>
<input type="password" name="password_confirmation">
</div>
<button type="submit">Submit</button>
</form>
以上就是如何在旧值中设置条件值或使用验证编辑新值无法在 Laravel 中重定向回的介绍。希望对您有所帮助!