Laravel 请求验证不显示错误消息
Laravel request validation doesn't show error messages
使用组中间件后,无法访问错误消息。错误包 returns 为空。
之前没有问题
我研究过,有用户通过修改http/kernel.php
解决了问题
\Illuminate\Session\Middleware\StartSession::class, $middlewareGroups 到 $middleware。
但是,它对我不起作用。
另外 $validated = $request->validated(); 函数没有 returns 验证错误。在我的 CreditcardRequest Class 中,我有属性、消息、规则函数。如果验证失败,则需要显示这些消息。
以前验证时();方法是 运行 在控制器上,如果表单为空,它会显示消息。在中间件分组之前,我有 20 个页面都在工作。
信用卡Blade
<div class="messages">
@if ($errors->any())
<div class="row mt-3">
<div class="col-md-12">
<div class="alert alert-warning alert-dismissable" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h3 class="alert-heading font-size-h4 font-w400">Error!</h3>
@foreach ($errors->all() as $error)
<p class="mb-0">{{ $error }}</p>
@endforeach
</div>
</div>
</div>
@endif
</div>
信用卡请求
public function attributes()
{
return [
'cc_name' => 'CC Owner',
..
];
}
public function messages()
{
return [
'required' => 'Required: :attribute',
...
];
}
public function rules()
{
return [
'cc_name' => 'required|max:128',
];
}
控制器
public function doPaySection(CreditcardRequest $request)
{
$validated = $request->validated();
$cc = TRUE;
if ($cc):
return redirect('/pay_success')->with('success', 'success');
else:
return redirect('/pay_error')->with('error', 'error');
endif;
}
web.php
Route::group(['middleware' => ['client.role:guest']], function () {
Route::get('/login', 'HomepageController@showLogin')->name('login');
Route::post('/login', 'HomepageController@doLogin');
Route::post('/register', 'HomepageController@doRegister');
Route::get('/register', 'HomepageController@showRegister')->name('register');
});
login.blade
@if ($errors->any())
<div class="row mt-3">
<div class="col-md-12">
<div class="alert alert-warning alert-dismissable" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h3 class="alert-heading font-size-h4 font-w400">Hata!</h3>
@foreach ($errors->all() as $error)
<p class="mb-0">{{ $error }}</p>
@endforeach
</div>
</div>
</div>
@endif
控制器
public function doLogin(Request $request)
{
if (auth()->guard('client')->attempt(['email' => request('email'), 'password' => request('password')])) {
return redirect()->intended('/');
} else {
return redirect()->back()->with('error', 'error');
}
}
你可以从下面session('error')
进去
return redirect()->back()->with('errors', 'error');
所以你的代码会像
@if (session('errors'))
<div class="row mt-3">
<div class="col-md-12">
<div class="alert alert-warning alert-dismissable" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h3 class="alert-heading font-size-h4 font-w400">Hata!</h3>
@foreach (session('errors') as $error)
<p class="mb-0">{{ $error }}</p>
@endforeach
</div>
</div>
</div>
@endif
您现在拥有的代码不会向 $errors
MessageBag
添加消息,它只会向名为错误的会话添加一个值。
如果你想在消息包中添加错误,你可以简单地抛出一个 ValidationException
重定向 back
与该消息:
public function doLogin(Request $request)
{
if (auth()->guard('client')->attempt($request->only('email', 'password'))) {
return redirect()->intended('/');
}
throw ValidationException::withMessages([
'error' => 'The error message',
]);
}
不要忘记将 ValidationException
导入为:
use Illuminate\Validation\ValidationException;
你能试试在你的请求中使用这个 header 吗?特别是如果你是从邮递员那里打来的。
Accept:application/json
在使用这个之前,我会在无效请求的情况下获取 csrf 令牌。
使用组中间件后,无法访问错误消息。错误包 returns 为空。
之前没有问题
我研究过,有用户通过修改http/kernel.php
解决了问题\Illuminate\Session\Middleware\StartSession::class, $middlewareGroups 到 $middleware。
但是,它对我不起作用。
另外 $validated = $request->validated(); 函数没有 returns 验证错误。在我的 CreditcardRequest Class 中,我有属性、消息、规则函数。如果验证失败,则需要显示这些消息。 以前验证时();方法是 运行 在控制器上,如果表单为空,它会显示消息。在中间件分组之前,我有 20 个页面都在工作。
信用卡Blade
<div class="messages">
@if ($errors->any())
<div class="row mt-3">
<div class="col-md-12">
<div class="alert alert-warning alert-dismissable" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h3 class="alert-heading font-size-h4 font-w400">Error!</h3>
@foreach ($errors->all() as $error)
<p class="mb-0">{{ $error }}</p>
@endforeach
</div>
</div>
</div>
@endif
</div>
信用卡请求
public function attributes()
{
return [
'cc_name' => 'CC Owner',
..
];
}
public function messages()
{
return [
'required' => 'Required: :attribute',
...
];
}
public function rules()
{
return [
'cc_name' => 'required|max:128',
];
}
控制器
public function doPaySection(CreditcardRequest $request)
{
$validated = $request->validated();
$cc = TRUE;
if ($cc):
return redirect('/pay_success')->with('success', 'success');
else:
return redirect('/pay_error')->with('error', 'error');
endif;
}
web.php
Route::group(['middleware' => ['client.role:guest']], function () {
Route::get('/login', 'HomepageController@showLogin')->name('login');
Route::post('/login', 'HomepageController@doLogin');
Route::post('/register', 'HomepageController@doRegister');
Route::get('/register', 'HomepageController@showRegister')->name('register');
});
login.blade
@if ($errors->any())
<div class="row mt-3">
<div class="col-md-12">
<div class="alert alert-warning alert-dismissable" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h3 class="alert-heading font-size-h4 font-w400">Hata!</h3>
@foreach ($errors->all() as $error)
<p class="mb-0">{{ $error }}</p>
@endforeach
</div>
</div>
</div>
@endif
控制器
public function doLogin(Request $request)
{
if (auth()->guard('client')->attempt(['email' => request('email'), 'password' => request('password')])) {
return redirect()->intended('/');
} else {
return redirect()->back()->with('error', 'error');
}
}
你可以从下面session('error')
return redirect()->back()->with('errors', 'error');
所以你的代码会像
@if (session('errors'))
<div class="row mt-3">
<div class="col-md-12">
<div class="alert alert-warning alert-dismissable" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h3 class="alert-heading font-size-h4 font-w400">Hata!</h3>
@foreach (session('errors') as $error)
<p class="mb-0">{{ $error }}</p>
@endforeach
</div>
</div>
</div>
@endif
您现在拥有的代码不会向 $errors
MessageBag
添加消息,它只会向名为错误的会话添加一个值。
如果你想在消息包中添加错误,你可以简单地抛出一个 ValidationException
重定向 back
与该消息:
public function doLogin(Request $request)
{
if (auth()->guard('client')->attempt($request->only('email', 'password'))) {
return redirect()->intended('/');
}
throw ValidationException::withMessages([
'error' => 'The error message',
]);
}
不要忘记将 ValidationException
导入为:
use Illuminate\Validation\ValidationException;
你能试试在你的请求中使用这个 header 吗?特别是如果你是从邮递员那里打来的。
Accept:application/json
在使用这个之前,我会在无效请求的情况下获取 csrf 令牌。