验证失败后,laravel显示旧的帖子数据

我正在尝试更新帖子,为此,我拥有带有以下标记的表单

<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');
}
guolingkai2009 回答:验证失败后,laravel显示旧的帖子数据

您可以将默认值传递给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>
,

您需要使用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');
}
,
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包含一个将空字符串(如名称输入)转换为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 }}">

希望这会有所帮助

本文链接:https://www.f2er.com/3159790.html

大家都在问