【问题标题】:Laravel Validation: bail rule not workingLaravel 验证:保释规则不起作用
【发布时间】:2020-03-01 01:39:23
【问题描述】:

根据Laravel Documentationbail 规则应在第一次验证失败后停止运行验证规则。

我在App\Http\* 命名空间之外有一个文件,其中包含以下代码:

if(Validator::make($params, [
    'email' => 'bail|required|email|max:60|exists:customers,email',
    'password' => 'required|max:60|string',
    'password' => new CustomerCheckPassword($params['email']),
]) -> fails())
    throw new Exception('message here');

就像一个魅力,除了email 属性中的bail 规则在$params['email'] 不包含在customers.email 中时不会停止验证,并且还会继续到password。对于这个问题,您有什么想法或优雅的解决方法吗?

【问题讨论】:

    标签: php laravel validation


    【解决方案1】:

    在同一文档页面的不同部分(它不会直接链接到它),它解释说bail 仅适用于当前属性。例如,如果email 缺失,它不会检查required 之后的任何内容,但password 是一个新属性,因此它会正常验证它。

    有时您可能希望在第一次验证失败后停止对属性运行验证规则。为此,请将保释规则分配给属性:

    实现此目的的一种方法是使用sometimes 方法

    Validator::make($params, [
        'email' => 'bail|required|email|max:60|exists:customers,email',
        'password' => 'required|max:60|string',
    ])->sometimes('password', new CustomerCheckPassword($params['email']), function ($input) {
        // Check input to decide if rule should execute
    });
    

    【讨论】:

    • 非常感谢您的回答!你知道在第一次失败后防止检查其他属性的优雅解决方案吗?
    • 我不确定,因为我不熟悉您的用例,以及为什么您需要在第一个错误后停止。如果您尝试将错误限制为 1,则可以执行 $validator = Validator::make(...) 然后检查 if ($validator->fails()) { 并使用第一个错误,如下所示:$error = $validator->errors()->first()。但我不确定这就是你要找的东西。
    • CustomerCheckPassword 需要有效的电子邮件,该电子邮件存在于表中,否则会引发异常。我可以再次检查规则中是否存在电子邮件并防止异常,但我很高兴这可以以更简单的方式完成。
    • 我想我明白你的目的了。不幸的是,我不知道有一种方法可以像您正在寻找的那样简洁。我认为不检查CustomerCheckPassword 内部的唯一方法是使用sometimes function(在“复杂条件验证”标题下)仅在电子邮件存在时添加规则。这不会为您节省任何代码行,但会处理验证器中的所有逻辑。
    • 感谢您的回复!这解决了问题。请更新答案以包含此信息以供进一步参考:)
    猜你喜欢
    • 2018-11-09
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2020-07-17
    • 2018-07-18
    • 2023-04-02
    • 2013-12-01
    相关资源
    最近更新 更多