Laravel 中的 required_if 验证

Posted

技术标签:

【中文标题】Laravel 中的 required_if 验证【英文标题】:required_if validation in Laravel 【发布时间】:2021-03-06 23:57:10 【问题描述】:

我正在尝试添加规则来验证字段。仅当正文字段包含 html 时才需要“sn-p”字段。我的控制器存储方法中有以下内容,但我不太清楚 required_if 如何与正则表达式一起检查字段是否包含 HTML:

$newsitem->update(request()->validate([
            'snippet' => 'nullable|max:255|not_regex:/[<>]/',
            'body' => 'required',
            ]));

从 Laravel 文档中,它看起来像:'required_if:anotherfield,value' 验证规则根据值返回一个布尔值,但我需要根据正文字段的正则表达式检查返回一个布尔值。

我知道我可以检查身体是否等于一:

'snippet' => 'required_if:body,==,1|nullable|max:255|not_regex:/[<>]/'

...但我需要一些东西来检查正文是否包含 。 (我可以在我的表单提交中添加一个隐藏字段,如果正文包含使用 javascript 的 html,它将获得一个值集,但我希望能够通过后端验证来处理这个问题。)

我需要使用自定义验证规则,还是可以单独使用默认的 Laravel 验证规则来处理?

我在 Laravel 文档中看到您可以使用:Rule::requiredIf 方法来构建更复杂的条件。这是我可以与 contains_hmtl 函数一起使用的东西吗?

'snippet' => Rule::requiredIf($request->snippet()->contains_html),

我真的觉得我在这里遗漏了一些东西,所以任何指针都将不胜感激。

【问题讨论】:

【参考方案1】:

RequiredIf 规则接受一个应该返回布尔值的闭包。

Rule::requiredIf(function () use ($request) 
    //Perform the check on $request->snippet to determine whether it is a valid HTML here
    //Return true if it is valid HTML else return false
),

【讨论】:

【参考方案2】:

使用RequiredIf 尝试以下正则表达式:

[
    ...,
    'snippet' => ['nullable', 'max:255', new RequiredIf(function () 
        return preg_match('/<[^<]+>/m', request()->input('body')) !== 0;
    )],
    ...,
]

【讨论】:

太好了,谢谢!我只需将new RequiredIf 更改为:Rule::RequiredIf 并将use Illuminate\Validation\Rule; 添加到控制器的顶部。我想我对 laravel 提供的内置验证功能有点眼花缭乱,甚至忘记考虑 php preg_match 功能......再次感谢。

以上是关于Laravel 中的 required_if 验证的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 翻译值 required_if

Laravel 验证器规则中不同字段上的多个“required_if”

当当前输入等于数组内的值时,Laravel 验证 required_if(带有输入文本的复选框)

required_if 带有数组验证规则的验证规则不起作用 |拉拉维尔 |验证

表单请求验证中的 Laravel“独特”自定义消息验证

如何验证 Laravel 中的确切单词?