【问题标题】:laravel Show old post data once validation is failedlaravel 验证失败后显示旧的帖子数据
【发布时间】: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-&gt;name }} 计算结果为 false 并显示 $service-&gt;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-&gt;name) }}
  • 当您的验证失败时,您在控制器中重定向回表单的语句是什么?请添加您的控制器代码。
  • 嗨 Digvijay,我已经添加了我的控制器代码,你能帮帮我吗
  • @user3209130 你能试试Validator::make() 方法吗,因为它有那个方法fails()
  • @user3209130 我的代码解决了你的问题吗?

标签: laravel forms validation


【解决方案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-&gt;name

    您可以在 App\Http\Kernel 中删除/评论该中间件,并且仅在初始表单加载时显示 $service-&gt;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');
      }
      

      【讨论】:

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