Laravel 5.2验证错误

Laravel 5.2验证错误,laravel,laravel-validation,laravel-5.2,Laravel,Laravel Validation,Laravel 5.2,我对Laravel 5.2中的验证有一些问题 当我尝试像这样在控制器中验证请求时 $this->validate($request, [ 'title' => 'required', 'content.*.rate' => 'required', ]); 验证程序捕获错误,但不将它们存储到会话,所以当我尝试调用模板时 @if (isset($errors) && coun

我对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
当我尝试验证此代码时

 $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');
与:


自Laravel 5.2.27起更新

Laravel现在默认支持web中间件,如下所示:

换句话说,您不再需要围绕web中间件组包装路由,因为它在RouteServiceProvider文件中为您包装路由。但是,如果您使用的是介于5.2.0和5.2.26之间的Laravel版本,请参考以下方法:

以下内容仅适用于Laravel 5.2.0至5.2.26

在没有看到
routes.php
Kernel.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中间件堆栈。换句话说,它们在每个请求上运行。请注意这个特定的中间件:
illumb\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
变量取回呢

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

Route::group(['middleware' => ['web']], function () {
    // Add your routes here
});
如果您不打算构建API,另一个选择是将“web”中间件移动到全局中间件堆栈中,如5.1所示。

尝试使用

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

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

$this->validate($request, [
                'title' => 'required',
                'content.*.rate' => 'required',
            ]);
首先,在这样的模型中创建一个函数

$this->validate($request, [
                'title' => 'required',
                'content.*.rate' => 'required',
            ]);
在模型中,在开始时添加这行代码 使用Illumb\Support\Facades\Validator; 在控制器中调用此函数以验证输入

使用照明\支持\立面\重定向; 现在是模板部分

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

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

Route::group(['middleware' => ['web']], function () {
    // Add your routes here
});
app\Http\Kernel.php
中,将
\lightlight\Session\Middleware\StartSession::class
web
移动到
$Middleware

希望它能解决你的问题。

这会有用的

// Replace

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

// with 

Route::group(['middlewareGroups' => ['web']], function () {
    // Add your routes here
});
Route::group(['middlewareGroups' => ['web']], function () {
    // Add your routes here
});
而且这也有效

Route::post('location',array(
    'as'=>'location',
    'middlewareGroups'=>'web',
    'uses'=>'myController@function'
));
//控制器
$this->validateWith([
“标题”=>“必需”,
'内容。*.rate'=>'必需',
]);
//叶片模板
@如果($errors->has('title'))
{{$errors->first('title')}
@恩迪夫
@如果($errors->has('anotherfied'))
{{$errors->first('anotherfied')}
@恩迪夫
找到。

路线

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(计数($errors)>0)
    @foreach($errors->all()作为$error)
  • {{$error}}
  • @endforeach
@恩迪夫
Try“->withErrors($validator,'error');”不带'error',因此:->withErrors($validator);在v5.2中,您只将路由放入:Route::group(['middleware'=>['web']],function(){//在此处添加路由});事实上,这是可行的!我完全忘记了
web
中间件!作为提醒,如果您的路由被自动缓存,您将需要在此更改后运行
php artisan route:clear
。@Dmitry请检查此答案是否正确如果它解决了您的问题,它将帮助其他来此寻找同一问题解决方案的人!谢谢,这是一个比文档中任何内容都好的解释。我觉得拉威尔家的人为了自己的利益太聪明了。我发现5.2真的很难通过文档理解。@Ken这实际上不起作用,因为控制器中不支持“可终止”的中间件。但是,最近有一个变化,即默认情况下支持web中间件,我将在我的回答中更新。如果您添加一个说明,说明后者工作的原因以及
中间件
vs
中间件组
的作用,会更好。谢谢我不太清楚(我对PHP和Laravel也是新手),但如果你看看app\Http\Kernel.PHP,“web”是在$middlewareGroups数组中定义的。我遵循Laravel教程,其中使用了“中间件”,但在我的例子中,它与“middlewareGroups”一起使用o) 这管用!线索(我认为)是app/Http/Kernel中受保护变量的命名。Thomas Kim给出的示例中包含了这一点,但直到我看到这个简单的片段后才清楚。谢谢我花了好几个小时才修好!
Route::post('location',array(
    'as'=>'location',
    'middlewareGroups'=>'web',
    'uses'=>'myController@function'
));
// 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
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