【问题标题】:Laravel Validation: Validate two dates and times and validate them logicalyLaravel 验证:验证两个日期和时间并在逻辑上验证它们
【发布时间】:2020-03-07 12:52:09
【问题描述】:

我正在努力设置一个正确的验证来验证两个日期输入和两个时间输入。到目前为止,这是我的 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)。

【问题讨论】:

  • 为什么不使用&lt;input type="datetime-local"&gt;
  • 如您所见,需要可以输入没有时间的日期!
  • 允许 JS 处理连接是否更有意义?在提交之前,附加时间到日期并简单地验证时间戳格式和之前/之后的逻辑。我觉得您允许单独输入datetime 使这变得过于复杂。并且将datetime 分别存储在数据库中将是一件令人头疼的事情... datetime 可以从完全限定的时间戳中单独解析,但是如果它们是分开的则更难使用它们像这样。
  • 出于安全原因,我需要并且必须在服务器端对其进行验证!
  • 它仍然会...您将完全限定的时间戳发送为startend,而不是start_dateend_datestart_timeend_time。跨度>

标签: php laravel date validation datetime


【解决方案1】:

正如@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(),它也适用于时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 2016-09-04
    • 2013-08-12
    • 2020-10-24
    相关资源
    最近更新 更多