laravel 验证失败后显示旧的帖子数据
Posted
技术标签:
【中文标题】laravel 验证失败后显示旧的帖子数据【英文标题】:laravel Show old post data once validation is failed 【发布时间】:2020-03-01 19:29:22 【问题描述】:我正在尝试更新帖子,为此我有带有以下标记的表单
<form method="post" action=" admin_url('services/'.$service->id) ">
<input name="_method" type="hidden" value="PATCH">
<div class="form-group">
<label for="name">Service Name</label>
<input type="text" class="form-control" id="name" name="name"
value=" old('name') ? old('name') : $service->name ">
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
最初,当表单打开时,它应该显示模型值 $service->name,一旦提交表单,如果验证失败,它必须显示旧输入
问题是输入为空时,逻辑 old('name') ? old('name') : $service->name
计算结果为 false 并显示 $service->name
而不是空值。
我的控制器代码
public function update($id, Request $request)
$validatedData = $request->validate([
'name' => 'required|max:255|min:5'
]);
$service = Service::find($id);
$service->name = $request->input('name');
$service->save();
return redirect(admin_url('services'))->with('message', 'Service updated successfully');
【问题讨论】:
试试 old('name', $service->name)
当您的验证失败时,您在控制器中重定向回表单的语句是什么?请添加您的控制器代码。
嗨 Digvijay,我已经添加了我的控制器代码,你能帮帮我吗
@user3209130 你能试试Validator::make()
方法吗,因为它有那个方法fails()
@user3209130 我的代码解决了你的问题吗?
【参考方案1】:
您可以将默认值传递给old 函数,如果会话中没有具有该名称的值,将使用该函数。
更换
old('name') ? old('name') : $service->name
与
old('name', $service->name)
应该可以解决您的问题。
完整代码:
<form method="post" action=" admin_url('services/'.$service->id) ">
<input name="_method" type="hidden" value="PATCH">
<div class="form-group">
<label for="name">Service Name</label>
<input type="text"
class="form-control"
id="name"
name="name"
value=" old('name', $service->name) ">
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
【讨论】:
【参考方案2】:Laravel 包含一个将空字符串(如输入的名称)转换为 null 的中间件,因此始终显示 $service->name
您可以在 App\Http\Kernel
中删除/评论该中间件,并且仅在初始表单加载时显示 $service->name
protected $middleware = [
\App\Http\Middleware\TrustProxies::class,
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
// This one down here
// \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
然后在标记中
<input type="text" class="form-control" id="name" name="name" value=" old('name') ?? $service->name ">
希望对你有帮助
【讨论】:
【参考方案3】:你需要使用Validator::make()
方法
$validator = Validator::make($request->all(), [
'name' => 'required|min:2|max:255'
]);
if ($validator->fails())
return Redirect::back()->withErrors($validator)->withInput();
else
return redirect(admin_url('services'))->with('message', 'Service updated successfully');
【讨论】:
也不起作用,我认为当对请求对象调用验证时,laravel 会自动触发 Redirect::back()->withErrors($validation)->withInput();基于laravel.com/docs/6.x/requests#old-input @user3209130 上面的逻辑不能正常工作?检查发生的任何错误。【参考方案4】:use Illuminate\Support\Facades\Validator;
$validator = Validator::make($request->all(), [
'name' => 'required|min:2|max:255'
]);
if ($validator->fails())
return redirect()->route('your_route')->withInput(['name'=>$request->name])->withErrors($validator,'validation');
else
return redirect(admin_url('services'))->with('message', 'Service updated successfully');
【讨论】:
以上是关于laravel 验证失败后显示旧的帖子数据的主要内容,如果未能解决你的问题,请参考以下文章