【问题标题】:Validation error in Laravel - $errors array does not get populated after the validation failureLaravel 中的验证错误 - 验证失败后未填充 $errors 数组
【发布时间】:2016-07-29 23:11:55
【问题描述】:

我在 Laravel 5.2 中遇到了一个关于验证的奇怪问题。我在 StackOverflow 上查看了以下问题,但似乎都不适用于我的案例:

Laravel validation not showing errors

Laravel Validation not returning error

问题是,我正在尝试验证 title 字段,然后将 Card 对象持久保存到数据库中。当我按预期提交带有空 title 字段的表单时,它没有通过验证。但是,$errors 数组在上述验证失败时不会被填充。谁能解释这段代码我哪里出错了?

/////////////////////// CONTROLLER /////////////////////
public function create(Request $request)
{
    $this->validate($request, [
        'title' => 'required|min:10'
    ]);

    Card::create($request->all());
    return back();
}
///////////////////////// VIEW /////////////////////////
// Show errors, if any. (never gets triggered)
@if(count($errors))
    <ul>
        @foreach($errors->all() as $error)
            <li>{{ $error }}</li>
        @endforeach
    </ul>
@endif
<form method="POST" action="/cards">
    {{ csrf_field() }}

    <div class="form-group">
        // The textarea does not get populated with the 'old' value as well
        <textarea class="form-control" name="title">{{ old('title') }}</textarea>
    </div>

    <div class="form-group">
        <button class="btn btn-primary" type="submit">Add Card</button>
    </div>
</form>

【问题讨论】:

  • 您能否附上您的routes.php 文件以及完整的控制器文件?不知何故,我相信会发生一些双重重定向,并且您的 $errors 不会从一个重定向传递到另一个重定向。或者,如果您使用的是 restful 路由,create 方法不是放置存储功能的地方 - store 是地方。
  • @GiedriusKiršys 问题确实出在路由文件中,因为我两次包含“web”中间件组(正如接受的答案指出的那样)。感谢关于宁静路线的建议,会记住的。

标签: laravel laravel-5 laravel-5.2 laravel-validation


【解决方案1】:

如果您运行的是 Laravel 5.2.27 及更高版本,则不再需要使用 web 中间件组。事实上,你不应该将它添加到你的路由中,因为它现在默认会自动应用。

如果你打开你的app/Http/RouteServiceProvider.php 文件,你会看到这段代码:

protected function mapWebRoutes(Router $router)
{
    $router->group([
        'namespace' => $this->namespace, 'middleware' => 'web',
    ], function ($router) {
        require app_path('Http/routes.php');
    });
}

来源:https://github.com/laravel/laravel/blob/master/app/Providers/RouteServiceProvider.php#L53

如您所见,它会自动为您应用网络中间件。如果您尝试在您的路由文件中再次应用它(不止一次),您将遇到像您当前面临的奇怪问题。

为了找出你正在运行的 Laravel 版本,运行这个命令:php artisan --version

【讨论】:

  • 天哪!我会花很长时间来弄清楚这一点。非常感谢!
【解决方案2】:

我猜你必须将 if 子句设置为 @if(count($errors) &gt; 0)

【讨论】:

  • @if(count($errors))@if(count($errors) &gt; 0) 相等
【解决方案3】:

在您的控制器中,尝试添加 $validator-&gt;fails() 语句,并使用 -&gt;withErrors() 将任何错误返回到您的模板。

public function create(Request $request)
{
    $validator = Validator::make($request->all(), [
        'title' => 'required|min:10'
    ]);

    if ($validator->fails()) {
        return back()->withErrors($validator);
    }

    Card::create($request->all());
    return back();
}

【讨论】:

  • 感谢您的回复。结果是一样的,但是接受的答案解决了我的问题
猜你喜欢
  • 2019-03-13
  • 2020-11-22
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多