【问题标题】:Validate forms with laravel bag使用 laravel 包验证表单
【发布时间】:2021-01-01 23:30:36
【问题描述】:

我在一个页面上有多个带有验证的表单,因此一旦提交,它就会在每个表单上显示验证错误。我想防止这种情况发生,所以如果提交了表单 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

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

【问题讨论】:

  • 如果有帮助请查看question
  • 不需要这一行 return redirect()-&gt;back()-&gt;withErrors($validator); 因为验证失败时 validateWithBag() 应该会自动重定向

标签: php laravel


【解决方案1】:

猜你也需要发送错误包的名称

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

【讨论】:

  • 遗憾的是它不起作用:
  • 尝试运行php artisan view:clear 并再次检查
  • 还是一样。我曾经设法完成这项工作,但有些混乱,可以再次复制它..
【解决方案2】:

您正在使用-&gt;validateWithBag('email'); 获得自动重定向,请参阅Automatic redirection,
但你仍然通过return redirect()-&gt;back()-&gt;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.',
        ]);

【讨论】:

  • 感谢您的回答,但是如何遍历此表单的所有错误,而不是选择每个错误?
  • 成功了!但是我必须 ->validateWithBag('email') 在验证数组中和 withErrors($validator, 'email') 和 ($errors->email->all() 在视图中。有趣的是我已经尝试了所有这些之前的东西,但在任何页面重新加载和代码更改之前的 atm 我已经应用了 clear chace
【解决方案3】:

您看到的行为是预期的。 $errors-&gt;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>
@endif

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-18
    • 2018-12-23
    • 2021-06-06
    • 2019-04-27
    • 2023-03-19
    • 2016-09-02
    相关资源
    最近更新 更多