【问题标题】:Laravel 5.2 Validation Rules OrderLaravel 5.2 验证规则顺序
【发布时间】:2018-11-25 01:15:43
【问题描述】:

我做了一个自定义验证规则,它遍历包含键 dates 的对象数组,并检查这些日期是否是连续的(日期之间的差异仅为 1 天)。为此,我需要填写“日”键并具有正确的日期格式。我将date_format 验证器规则放在day 键中,但由于我的自定义规则在数组字段中,当我没有给他正确的日期格式(例如随机字符串)时它会崩溃。也许你对代码的理解更好。

自定义验证器规则

Validator::extend('consecutive_dates', function($attribute, $value, $parameters, $validator) {
    // Order the in the array with the 'day' value
    usort($value, array($this, 'compare_dates'));
    $previous_date = null;
    foreach ($value as $date) {
    // Check if dates are consecutives
        $current_date = new DateTime($date['day']);
        if ($previous_date !== null) {
            $interval = $current_date->diff($previous_date);
            if ($interval->days !== 1) {
                // If not, fails
                return false;
            }
        }
        $previous_date = $current_date;
    }
    return true;
);

规则定义

'dates.*.day' => 'required_with:dates|date_format:Y-m-d',
'dates' => 'bail|array|filled|consecutive_dates',

现在,如果我尝试验证这样的事情:

"dates": [{
    "day": "fdsa",
}]

它会崩溃并说

DateTime::__construct(): Failed to parse time string (fdsa) at position 0 (f): The timezone could not be found in the database

问题是:有没有办法告诉 Laravel 首先验证 'dates.*.day' 必须有 date_format: Y-m-d 这样自定义验证不会失败?

【问题讨论】:

    标签: php laravel validation laravel-5.2


    【解决方案1】:

    你应该首先检查给定的值是否有效,像这样

    if (Carbon::createFromFormat('date format', $date['day']) !== false) {
            // valid date
    }
    

    我希望这会有所帮助。

    【讨论】:

    • 您的意思是在我的自定义验证中吗?我知道我可以在自定义验证中检查它,但我已经使用date_format:Y-m-d 进行了验证,所以我不想重复自己。这就是为什么我想知道 Laravel 中是否有类似规则顺序的东西,或者我必须再次检查它。
    • 是的,我的意思是检查你的自定义验证,你能在自定义控制器上检查这些参数$attribute, $value, $parameters, $validator,也许这些是包含日期格式,所以你不要重复自己。
    猜你喜欢
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 2020-06-25
    • 2020-06-09
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多