Laravel表单验证器如何验证日期/时间区间?

laravel表单验证器自带了date、date_equals、date_format三个日期时间验证器,但是都是针对单一日期值的,在实际开发中,我们经常会遇到列表页按时间范围查询数据,这个日期值可能是这样的

'2022-06-01,2022-07-30'

我尝试使用date_format验证器来验证它

//初次尝试 逗号,会被识别成验证器参数分隔符,只有第一个Y-m-d生效
'month'   => 'required|date_format:Y-m-d,Y-m-d',

/*
* 尝试改变,将 ‘Y-m-d,Y-m-d’ 用引号包起来,看能不能作为一个参数传递给date_format验证器
* 依旧失败,laravel依旧只之别了最前面的Y-m-d作为规则进行验证
*/
'month'   => 'required|date_format:\'Y-m-d,Y-m-d\'',

目前能用的方案,快速验证器是用不了了,只能手动将daterange字符串手动分割,然后传递给验证器

list($date_start, $date_end) = explode(',', $daterange);
$validator = Validator::make([
    'abc'        => $request->input('abc'),
    'date_start' => $date_start,
    'date_end'   => $date_end,
    ...其他参数
], [
    'date_start'   => 'required|date_format:Y-m-d,Y-m-d',
    'date_end'   => 'required|date_format:Y-m-d,Y-m-d',
    ...其他参数验证
]);

这显然不太优雅,有什么什么优雅的方式验证日期时间区间格式,甚至是验证起始范围

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 13
3周前 评论
没有哆啦A梦的大雄 (楼主) 3周前
zhaojjiang 3周前
kis龍 (作者) 3周前

为啥不传两个参数:start_time、end_time

3周前 评论
没有哆啦A梦的大雄 (楼主) 3周前

如果非要這樣寫的話 為啥不用regex呢 表單正則驗證一下

3周前 评论
没有哆啦A梦的大雄 (楼主) 3周前

自定义验证规则,想怎么搞怎么搞,

php artisan make:rule test
3周前 评论

可以尝试下 :joy:

$validated = $request->validate([
    'date'   => ['required', 'array', 'size:2'],
    'date.*' => ['date_format:Y-m-d'],
    'date.1' => ['after:date.0']
]);
{
    "date": [
        "2022-07-01",
        "2022-07-13"
    ]
}
3周前 评论
kis龍 3周前

按你现在的验证规则,封装到rule后面复用就好吧

php artisan make:rule CustomDate 
<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Validation\Concerns\ValidatesAttributes;

class CustomDate implements Rule
{
    use ValidatesAttributes;

    protected ?string $attrName;
    protected string $format;

    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct($format,$attrName=null)
    {
        $this->format = $format;
        $this->attrName = $attrName;
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        $dates = explode(',', $value);
        return $this->validateDateFormat($attribute, $dates[0], ['Y-m-d']) && $this->validateDateFormat($attribute,$dates[1],['Y-m-d']);
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        $attrName = $this->attrName ?? ':attribute';
        return $attrName . '格式错误,必须为'.$this->format.'格式';
    }
}

使用

$validate = \Validator::make([
            'fir'=>'2022/06/10,2022-06-11',
            'sec'=>'2022-06-10,2022-06-11',
        ],[
            'fir' => [new CustomDate('Y-m-d')],
            'sec' => [new CustomDate('Y-m-d')],
        ]);
        if($validate->fails()){
            dd($validate->errors());
        }
3周前 评论
没有哆啦A梦的大雄 (楼主) 3周前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!