Laravel 5.2验证错误
我对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
$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