22

当我尝试像这样在控制器中验证请求时,我在 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());
            }

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

怎么了?

4

9 回答 9

49

从 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 中。

于 2015-12-22T17:28:01.390 回答
5

尝试使用

return redirect()->back()
              ->withInput($request->all())
              ->withErrors($validator->errors()); // will return only the errors
于 2016-04-30T08:15:13.733 回答
3

尝试替换:

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

和:

->withErrors($validator);
于 2015-12-22T17:07:40.943 回答
2
// Replace

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

// with 

Route::group(['middlewareGroups' => ['web']], function () {
    // Add your routes here
});
于 2016-05-30T19:10:25.833 回答
1

我在 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');
});
于 2016-05-05T09:43:31.537 回答
0

这将起作用

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

以及这也有效

Route::post('location',array(
    'as'=>'location',
    'middlewareGroups'=>'web',
    'uses'=>'myController@function'
));
于 2016-06-14T10:16:01.650 回答
0

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

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

和在从到app\Http\Kernel.php移动\Illuminate\Session\Middleware\StartSession::classweb $middlewareGroups$middleware

希望它能解决你的问题。

于 2016-05-17T04:07:24.013 回答
0
// 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

查找文档

于 2018-03-16T06:22:11.853 回答
0

路线

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
于 2018-09-27T12:00:04.313 回答