0

我正在努力建立一个正确的验证来验证两个日期输入和两个时间输入。到目前为止,这是我的 html 代码:

<div class="form-group">
    <label for="name" class="control-label">Start date</label>
    <input type="date" class="form-control" name="start_date">
</div>
<div class="form-group">
    <label for="name" class="control-label">Start time</label>
    <input type="time" class="form-control" name="start_time">
</div>
<div class="form-group">
    <label for="name" class="control-label">End date</label>
    <input type="date" class="form-control" name="end_date">
</div>
<div class="form-group">
    <label for="name" class="control-label">End time</label>
    <input type="time" class="form-control" name="end_time">
</div>

如您所见,您可以输入分开的开始日期和开始时间以及结束日期和结束时间。这可能会导致许多逻辑错误,例如结束日期 + 结束时间在开始时间 + 开始日期之前,或者结束日期在开始时间之前。

我想允许以下组合(如果没有设置 start_time,它应该自动设置为 00:00,如果没有设置 end_time,它应该自动设置为 23:59):

  1. 开始日期
  2. 开始日期和开始时间
  3. 结束日期
  4. 结束日期和结束时间
  5. 开始日期和结束日期
  6. 开始日期 & 开始时间 & 结束日期
  7. 开始日期和结束日期
  8. 开始日期 & 开始时间 & 结束日期 & 结束时间

这是我到目前为止所得到的验证器规则:

'start_date' => ['required_if:start_time,date_format:H:i', 'date', 'nullable'],
'start_time' => ['date_format:H:i', 'nullable'],
'end_date' => ['required_if:end_time,date_format:H:i', 'date', 'nullable'],
'end_time' => ['date_format:H:i', 'nullable'],

但是,它并没有真正起作用,我不知道如何完成它。关于如何解决我的问题的任何提示和想法?

在我验证了输入之后,开始和结束日期(+时间)也应该在逻辑上进行验证。开始日期 (+time) 必须早于结束日期 (+time)。

4

1 回答 1

2

正如@Tim Lewis 所提到的,将日期和时间合并到一个输入(通过JS)更容易,然后您可以使用Laravel 的 before_or_equal 验证器:

$validator = Validator::make($data, [
    'start_date'    => 'required|date',
    'end_date'      => 'required|date|after_or_equal:start_date',
]); 

但是,如果出于某种原因您希望将日期和时间分开,您可以将验证分为两个步骤。首先,检查 start_date 中的日期是否早于不等于)结束日期。如果通过 = 验证通过,则根本不需要检查时间。如果失败,则检查日期是否相等以及 start_time 是否小于 end_time。像这样的东西:

$validator = Validator::make($data, [
    'start_date'    => 'required|date',
    'end_date'      => 'required|date|after:start_date',
]); 
if( $validator->fails() ) { // Dates are the same or wrong, check time
    $validator = Validator::make($data, [
       'start_date'    => 'required|date',
       'end_date'      => 'required|date|date_equals:start_date',
       'start_time'    => 'required|date',
       'end_time'    => 'required|date|after_or_equal:start_time',
    ]); 
    if( $validator->fails() ) { // Data is invalid
       abort(400);
    }
}

请注意,您将date在时间和日期上使用类型,因为它在内部调用 PHP,strtotime()它也适用于时间。

于 2019-11-11T20:42:42.520 回答