我将项目从存储库拉到了本地环境。我面临一个问题,验证消息不会显示在刀片上。
在我的控制器功能中,我可以像这样转储验证错误:
$validator = Validator::make($request->all(), [
'first_name' => 'required|min:3',
]);
if ($validator->fails()) {
dd($validator);
return redirect()->back()->withErrors($validator)->withInput();
}
我花了一些时间来搜索是什么导致了这个问题,我发现一些结果表明我的问题可能与web中间件有关。
最初,我的文件看起来是这样的:
路由服务提供商
protected function mapWebRoutes()
{
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
}
内核
protected $middleware = [
IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
IlluminateFoundationHttpMiddlewareValidatePostSize::class,
AppHttpMiddlewareTrimStrings::class,
IlluminateFoundationHttpMiddlewareConvertEmptyStringsToNull::class,
AppHttpMiddlewareTrustProxies::class,
];
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
AppHttpMiddlewareEncryptCookies::class,
IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
IlluminateSessionMiddlewareStartSession::class,
// IlluminateSessionMiddlewareAuthenticateSession::class,
IlluminateViewMiddlewareShareErrorsFromSession::class,
AppHttpMiddlewareVerifyCsrfToken::class,
IlluminateRoutingMiddlewareSubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
web.php
Route::get('register', 'AuthRegisterController@getRegister');
Route::post('register', 'AuthController@postRegister');
我试着用这样的web中间件包装我的路由:
Route::group(['middleware' => ['web']], function () {
Route::get('register', 'AuthRegisterController@getRegister');
Route::post('register', 'AuthController@postRegister');
});
此外,我试图将StartSession::class和ShareErrorsFromSession::class从中间件组移动到中间件,并从mapWebRoutes中删除中间件("web"(,但问题仍然存在。也许有人面临同样的问题,并能够解决它?
我的Laravel版本是:5.7.29,php版本:7.1.33
生产验证
与其返回$validator对象,不如返回可以使用$validator->errors()
获得的MessageBag
。
因此,您的退货声明将如下所示:
return redirect()->back()->withErrors($validator->errors())->withInputs()
MessageBag看起来像这个['attrXY' => [error1, error2, ...] ]
。这些错误将在您的刀片视图中的$errors
变量中自动显示。(由于withErrors((方法(您可以列出所有错误:
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
或者您可以检查是否存在特定错误:$errors->has('attrXY')
,并显示该属性的所有错误消息。
这些内容中的大部分,甚至更有用的信息都可以在文档中找到。https://laravel.com/docs/8.x/validation#quick-显示验证错误