首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用laravel bag验证表单

使用laravel bag验证表单
EN

Stack Overflow用户
提问于 2020-12-11 20:28:24
回答 3查看 829关注 0票数 0

我在一个页面上有多个带有验证的表单,所以一旦提交了其中一个表单,它就会在每个表单上显示验证错误。我希望防止这种情况发生,因此如果提交了表单1,我希望只显示表单1的验证消息,而不显示表单2。

这就是我目前的想法:

控制器

代码语言:javascript
复制
    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);

视图

代码语言:javascript
复制
                @if ($errors->any())
                    <div class="alert">
                        <ul>
                            @foreach ($validator->email as $error)
                                <li>{{ $error }}</li>
                            @endforeach
                        </ul>
                    </div>
                @endif

目前它只是返回到页面,没有任何反应,验证不起作用,也不会打印出任何东西……你能告诉我它出了什么问题吗?

EN

回答 3

Stack Overflow用户

发布于 2020-12-11 21:02:04

我想你也需要发送错误包的名字

代码语言:javascript
复制
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');
}

在刀片视图中,来自命名包的错误需要访问为

代码语言:javascript
复制
@if ($errors->any())
    <div class="alert">
         <ul>
             @foreach ($errors->email as $error)
                 <li>{{ $error }}</li>
             @endforeach
         </ul>
    </div>
@endif
票数 0
EN

Stack Overflow用户

发布于 2020-12-12 02:56:59

您正在使用->validateWithBag('email');获得自动重定向请参阅Automatic redirection

但您仍然要通过return redirect()->back()->withErrors($validator, 'email');

当它失败时,你也应该重定向,

代码语言:javascript
复制
if ($validator->fails()) {
            return redirect()
                        ->back()
                        ->withErrors($validator, 'email');
                        
        }

另外,如果你想要自动重定向,你可以直接使用

代码语言:javascript
复制
$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.',
        ]);
票数 0
EN

Stack Overflow用户

发布于 2021-01-01 23:30:37

你所看到的行为是意料之中的。$errors->any()检查default消息包,不考虑命名错误包。

Illuminate\Support\ViewErrorBag.php

代码语言:javascript
复制
/**
 * 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();
}

因此,要使用命名包显示特定表单的错误,您需要按如下方式访问它们:

代码语言:javascript
复制
@if ($errors->namedBag->any())
  <ul>
  @foreach($errors->namedBag->all() as $error)
    <li>{{ $error }}</li>
  @endforeach
  </ul>
@endif

如果您不想将所有验证错误消息放在一起,但可能希望将特定于字段的错误消息放在字段下面,则可以在命名错误包上提供带有字段名称的get()方法,以仅获取所需的错误:

代码语言:javascript
复制
@if ($errors->namedBag->get('name'))
  <ul>
  @foreach($errors->namedBag->get('name') as $error)
    <li>{{ $error }}</li>
  @endforeach
  </ul>
@endif
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65251394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档