【问题标题】:Laravel 5.2 validation errorsLaravel 5.2 验证错误
【发布时间】:2016-03-28 23:56:57
【问题描述】:

我在 Laravel 5.2 中的验证遇到​​了一些问题 当我尝试像这样在控制器中验证请求时

$this->validate($request, [
                'title' => 'required',
                'content.*.rate' => 'required',
            ]);

验证器捕获错误,但不要将它们存储到会话中,所以当我尝试在模板中调用此代码时

 @if (isset($errors) && count($errors) > 0)
        <div class="alert alert-danger">
            <ul>
                @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    @endif

Laravel 报错

Undefined variable: errors (View: /home/vagrant/Code/os.dev/resources/views/semantic/index.blade.php)

当我尝试使用此代码进行验证时

 $validator = Validator::make($request->all(), [
                'title' => 'required',
                'content.*.rate' => 'required'
            ]);

            if ($validator->fails()) {
                return redirect()
                    ->back()
                    ->withInput($request->all())
                    ->withErrors($validator, 'error');
            }

变量 $error 在模板中也不可用,但如果我尝试在控制器中显示错误

   if ($validator->fails()) {
                dd($validator->errors()->all());
            }

错误显示,但我无法从模板访问它们。

怎么了?

【问题讨论】:

  • 尝试 "->withErrors($validator, 'error');"没有“错误”所以:->withErrors($validator);
  • 在 v5.2 中,您只需将 Route 放入: Route::group(['middleware' => ['web']], function () { // 在此处添加您的路由 });

标签: laravel laravel-validation laravel-5.2


【解决方案1】:

自 Laravel 5.2.27 起更新

Laravel 现在默认支持 Web 中间件,您可以在此处看到:source

换句话说,您不再需要将路由包装在 Web 中间件组周围,因为它会在 RouteServiceProvider 文件中为您完成。但是,如果您使用的是 5.2.0 到 5.2.26 之间的 Laravel 版本,请参考以下方法:

以下仅适用于 Laravel 5.2.0 到 5.2.26

没有看到您的 routes.phpKernel.php 文件,这就是我怀疑正在发生的事情。

中间件的工作方式从 5.2 和 5.1 发生了变化。在 5.1 中,您将在 app/Http/Kernel.php 文件中看到这一点:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \App\Http\Middleware\EncryptCookies::class,
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \App\Http\Middleware\VerifyCsrfToken::class,
];

此数组是您应用程序的全局 HTTP 中间件堆栈。换句话说,它们在每个请求上运行。记下这个特定的中间件:Illuminate\View\Middleware\ShareErrorsFromSession。这就是在每个请求中添加 $errors 变量的原因。

但是,在 5.2 中,情况发生了变化,允许在同一个应用程序中同时使用 Web UI 和 API。现在,您将在同一个文件中看到:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
];

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],

    'api' => [
        'throttle:60,1',
    ],
];

全局中间件堆栈现在只检查维护。您现在有一个名为“web”的中间件组,其中包含大量以前的全局中间件。请记住,在同一个应用程序中同时允许 Web UI 和 API 是这样的。

那么我们如何取回 $errors 变量呢?

在您的路由文件中,您需要在“web”中间件组中添加您的路由,以便您可以在每次请求时访问该 $errors 变量。像这样:

Route::group(['middleware' => ['web']], function () {
    // Add your routes here
});

如果您不打算构建 API,另一种选择是将“网络”中间件移动到全局中间件堆栈,就像 5.1 中一样。

【讨论】:

  • 确实,这行得通!我完全忘记了web中间件!
  • 请注意,如果您的路线被自动缓存,您需要在此更改时运行php artisan route:clear
  • @Dmitry 如果它解决了您的问题,请检查此答案是否正确,它可以帮助其他来到这里寻找相同问题解决方案的人!
  • 谢谢,这比文档中的任何内容都更好。我认为 Laravel 的人为了他们自己的利益试图变得太聪明。我发现通过文档理解 5.2 真的很痛苦。
  • @Ken 这实际上不起作用,因为控制器不支持“可终止”中间件。但是,最近发生了一项更改,默认情况下支持 Web 中间件,我将在我的回答中更新。
【解决方案2】:

尝试使用

return redirect()->back()
              ->withInput($request->all())
              ->withErrors($validator->errors()); // will return only the errors

【讨论】:

    【解决方案3】:

    尝试替换:

    ->withErrors($validator, 'error');
    

    与:

    ->withErrors($validator);
    

    【讨论】:

      【解决方案4】:
      // Replace
      
      Route::group(['middleware' => ['web']], function () {
          // Add your routes here
      });
      
      // with 
      
      Route::group(['middlewareGroups' => ['web']], function () {
          // Add your routes here
      });
      

      【讨论】:

      • 如果您添加关于后者为何起作用以及middlewaremiddlewareGroups 的作用的描述会更好。谢谢!
      • 我不太清楚(我也是 PHP 和 Laravel 的新手),但如果你查看 app\Http\Kernel.php,“web”是在 $middlewareGroups 数组中定义的。我遵循 Laravel 教程,它与“中间件”一起使用,但在我的情况下,它与“中间件组”一起使用。 :o)
      • 这行得通!线索(我认为)是 app/Http/Kernel 中受保护变量的命名。 Thomas Kim 给出的包含这个,但直到我看到这个简单的 sn-p 才清楚。谢谢!这花了我 几个小时 来解决!
      【解决方案5】:

      我在 laravel 5.2 中有这样的工作验证代码

      首先在这样的模型中创建一个函数

      在模型开始处添加这行代码

      使用 Illuminate\Support\Facades\Validator;

      public static function validate($input) {
      
                  $rules = array(
                      'title' => 'required',
                      'content.*.rate' => 'required',
                    );
                  return Validator::make($input, $rules);
              }
      

      在控制器中调用这个函数来验证输入

      使用 Illuminate\Support\Facades\Redirect;

        $validate = ModelName::validate($inputs);
          if ($validate->passes()) {
                ///some code
           }else{
                 return Redirect::to('Route/URL')
                                  ->withErrors($validate)
                                  ->withInput();
            }
      

      现在是模板部分

      @if (count($errors) > 0)
          <div class="alert alert-danger">
              <ul>
                  @foreach ($errors->all() as $error)
                      <li>{{ $error }}</li>
                  @endforeach
              </ul>
          </div>
      @endif
      

      最重要的是你必须像这样写你的路线

      Route::group(['middleware' => ['web']], function () {
      
          Route::resource('RouteURL', 'ControllerName');
      });
      

      【讨论】:

        【解决方案6】:

        将路由包装在 web 中间件中,如下所示:

        Route::group(['middleware' => ['web']], function () {
            // Add your routes here
        });
        

        app\Http\Kernel.php 中将 \Illuminate\Session\Middleware\StartSession::classweb $middlewareGroups 移动到 $middleware

        希望它能解决你的问题。

        【讨论】:

          【解决方案7】:

          路线

          Route::group(['middlewareGroups' => ['web']], function () {
              // Add your routes here
              Route::resource('/post', 'PostController');
          });
          

          功能

          public function store(Request $request){
             $this->validate($request, [
                 //input field names
                'title' => 'required|max:20',
                'body' => 'required',
             ]);
          }
          

          查看

          @if (count($errors) > 0)
                  <div class="alert alert-danger">
                      <ul>
                          @foreach ($errors->all() as $error)
                              <li>{{ $error }}</li>
                          @endforeach
                      </ul>
                  </div>
          @endif
          

          【讨论】:

            【解决方案8】:

            这会起作用

            Route::group(['middlewareGroups' => ['web']], function () {
                // Add your routes here
            });
            

            这也有效

            Route::post('location',array(
                'as'=>'location',
                'middlewareGroups'=>'web',
                'uses'=>'myController@function'
            ));
            

            【讨论】:

              【解决方案9】:
              // Controller
              $this->validateWith([
                  'title' => 'required',
                  'content.*.rate' => 'required',
              ]);
              
              
              // Blade Template
              @if ($errors->has('title'))
                  <span class="error">
                      <strong>{{ $errors->first('title') }}</strong>
                  </span>
              @endif
              @if ($errors->has('anotherfied'))
                  <span class="error">
                      <strong>{{ $errors->first('anotherfied') }}</strong>
                  </span>
              @endif
              

              找到documentation

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2023-04-01
                • 2023-04-03
                • 2017-07-01
                • 2016-06-11
                • 2016-05-28
                • 2017-01-20
                • 2016-08-06
                • 1970-01-01
                相关资源
                最近更新 更多