字符串“today”的 Laravel 日期验证错误

Laravel date validation erroring for string "today"

提问人:TKoL 提问时间:11/2/2023 更新时间:11/6/2023 访问量:63

问:

我正在对日期字段使用laravel验证,如下所示:

Validator::make($shipment, [
            'collection_date' => 'required|date',
    ...

我正在发送带有此字段的 json:

"collection_date": "today",

它给出了这个错误:

{
    "collection_date": [
        "The collection date is not a valid date."
    ]
}

现在,你可能会说 DUH,这不是一个有效的日期字符串,但问题是:

我能找到的每一个解释 “date” 验证器在 Laravel 中如何工作的来源都说它使用了 PHP 的内部 strtotime 函数。 吐出与今天对应的时间戳(具体来说,今天早上 00:00)。既然如此,“今天”应该被 laravel 视为一个有效的“日期”,不是吗?strtotime("today")

php laravel datetime laravel-validation

评论


答:

0赞 Wolf_Developer 11/2/2023 #1

验证器将 json 中发送的“today”视为字符串,而不是验证日期格式。 使用日期规则时,Laravel 希望字段值采用直接表示日期的格式,例如“Y-m-d”(例如,“2023-10-31”)或“m/d/Y”(例如,“10/31/2023”)。虽然 PHP 的 strtotime 函数是宽容的,并且可以正确解释“今天”,但 Laravel 的日期规则并不将此类字符串表示视为有效的日期格式。

"collection_date": "2023-10-31",

评论

0赞 TKoL 11/2/2023
那么,为什么网上所有这些地方都说拉拉维尔的日期规则从字面上使用“strtotime”来检查它是否是有效的日期呢?这不对吗?laravel 的日期规则用于验证日期格式?
0赞 Wolf_Developer 11/2/2023
Laravel日期验证规则主要依靠PHP的strtotime函数来验证日期字符串。它应该检查给定的字符串是否可以被 PHP 解释为有效日期。但是,strtotime 解释“今天”或其他相对时间字符串的方式以及 Laravel 日期规则解释它们的方式可能存在不一致或差异。
0赞 TKoL 11/2/2023
如果存在不一致,那么就不能只是 Laravel 的日期规则使用 strtotime 的情况 - 它必须做一些不同的事情,或者除了 strtotime 之外。所以。。。这是什么?“日期”验证者在做什么?
-2赞 nidhinnp 11/2/2023 #2
 $jsonData = [
        [
            'collection_date' => Carbon::now()->format('Y-m-d'),
        ],

        // Add more data as needed
    ];
1赞 Othmane Nemli 11/2/2023 #3

Laravel使用parse_date()引擎盖下没有使用strtotime()功能 有关详细信息,可以查看 validateDate 函数 如果你想使用你的规则,你可以这样做

$validator = Validator::make($shipment, [
    'collection_date' => [
        'required',
        function (string $attribute, mixed $value, Closure $fail) {
            if (strtotime($value) === false) {
                $fail("The {$attribute} is invalid.");
            }
        },
    ],
])

或者,您可以进行自己的规则验证

如果您对日期规则不满意,可以通过扩展验证器来覆盖它

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Validator::extend('date', function ($attribute, $value, $parameters, $validator) {
            return !!strtotime($value);
        });
    }
}

// Then

$validator = Validator::make($shipment, [
    'collection_date' => [
        'required',
        'date'
    ],
])

评论

1赞 TKoL 11/2/2023
感谢您提供 validateDate 的链接,我明白现在发生了什么。它在一个阶段使用了 strtotime,但它也使用了 然后使用的函数——所以“今天”失败的原因是因为没有成功。谢谢。$date = date_parse($value);checkdatedate_parse('today')