我在一个页面上有多个带有验证的表单,所以一旦提交了其中一个表单,它就会在每个表单上显示验证错误。我希望防止这种情况发生,因此如果提交了表单1,我希望只显示表单1的验证消息,而不显示表单2。
这就是我目前的想法:
控制器
public function composeMail(Request $request)
{
$validator = Validator::make($request->all(),
[
'subject' => 'max:40|regex:/^[A-Za-z]+$/u',
'body' => 'required|min:1|max:1000|regex:/^[A-Za-z0-9]+$/u'
],
[
'subject.max' => 'Subject can be maximum 40 symbols length.',
'subject.regex' => 'In subject Only numbers and latin letters is allowed.',
'body.required' => 'Message cannot be empty.',
'body.min' => 'Message shall contain at least one character.',
'body.max' => 'Message can be only 10000 symbols length.',
'body.regex' => 'In message only numbers and latin letters is allowed.',
])->validateWithBag('email');
return redirect()->back()->withErrors($validator);视图
@if ($errors->any())
<div class="alert">
<ul>
@foreach ($validator->email as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif目前它只是返回到页面,没有任何反应,验证不起作用,也不会打印出任何东西……你能告诉我它出了什么问题吗?
发布于 2020-12-11 21:02:04
我想你也需要发送错误包的名字
public function composeMail(Request $request)
{
$validator = Validator::make($request->all(),
[
'subject' => 'max:40|regex:/^[A-Za-z]+$/u',
'body' => 'required|min:1|max:1000|regex:/^[A-Za-z0-9]+$/u'
],
[
'subject.max' => 'Subject can be maximum 40 symbols length.',
'subject.regex' => 'In subject Only numbers and latin letters is allowed.',
'body.required' => 'Message cannot be empty.',
'body.min' => 'Message shall contain at least one character.',
'body.max' => 'Message can be only 10000 symbols length.',
'body.regex' => 'In message only numbers and latin letters is allowed.',
])->validateWithBag('email');
return redirect()->back()->withErrors($validator, 'email');
}在刀片视图中,来自命名包的错误需要访问为
@if ($errors->any())
<div class="alert">
<ul>
@foreach ($errors->email as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif发布于 2020-12-12 02:56:59
您正在使用->validateWithBag('email');获得自动重定向请参阅Automatic redirection,
但您仍然要通过return redirect()->back()->withErrors($validator, 'email');。
当它失败时,你也应该重定向,
if ($validator->fails()) {
return redirect()
->back()
->withErrors($validator, 'email');
}另外,如果你想要自动重定向,你可以直接使用
$validatedData = $request->validateWithBag('email', [
'subject' => 'max:40|regex:/^[A-Za-z]+$/u',
'body' => 'required|min:1|max:1000|regex:/^[A-Za-z0-9]+$/u'
],
[
'subject.max' => 'Subject can be maximum 40 symbols length.',
'subject.regex' => 'In subject Only numbers and latin letters is allowed.',
'body.required' => 'Message cannot be empty.',
'body.min' => 'Message shall contain at least one character.',
'body.max' => 'Message can be only 10000 symbols length.',
'body.regex' => 'In message only numbers and latin letters is allowed.',
]);发布于 2021-01-01 23:30:37
你所看到的行为是意料之中的。$errors->any()检查default消息包,不考虑命名错误包。
Illuminate\Support\ViewErrorBag.php
/**
* Determine if the default message bag has any messages.
*
* @return bool
*/
public function any()
{
return $this->count() > 0;
}
/**
* Get the number of messages in the default bag.
*
* @return int
*/
public function count()
{
return $this->getBag('default')->count();
}因此,要使用命名包显示特定表单的错误,您需要按如下方式访问它们:
@if ($errors->namedBag->any())
<ul>
@foreach($errors->namedBag->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif如果您不想将所有验证错误消息放在一起,但可能希望将特定于字段的错误消息放在字段下面,则可以在命名错误包上提供带有字段名称的get()方法,以仅获取所需的错误:
@if ($errors->namedBag->get('name'))
<ul>
@foreach($errors->namedBag->get('name') as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endifhttps://stackoverflow.com/questions/65251394
复制相似问题