Laravel 5.1日期格式验证允许两种格式

25
我将使用以下日期验证来处理传入的POST请求。
(我使用以下日期验证来处理传入的POST请求。)
'trep_txn_date' => 'date_format:"Y-m-d H:i:s.u"'

这将只允许这种类型的日期,即 2012-01-21 15:59:44.8

我还希望允许没有时间的日期,例如 2012-01-21,当发送到mysql数据库时,会自动存储为 2012-01-21 00:00:00.0

是否可以使用Laravel现有的验证规则来实现此目的? 是否有一种方法在date_format规则中定义多个格式,例如下面的方式。

'trep_txn_date' => 'date_format:"Y-m-d H:i:s.u","Y-m-d"' //btw this didn't work.

谢谢,
K
2个回答

34

date_format验证器只接受一个日期格式参数。如果要使用多个格式,则需要构建自定义验证规则。幸运的是,这很简单。

您可以在AppServiceProvider中使用以下代码定义多格式日期验证:

class AppServiceProvider extends ServiceProvider  
{
  public function boot()
  {
    Validator::extend('date_multi_format', function($attribute, $value, $formats) {
      // iterate through all formats
      foreach($formats as $format) {

        // parse date with current format
        $parsed = date_parse_from_format($format, $value);

        // if value matches given format return true=validation succeeded 
        if ($parsed['error_count'] === 0 && $parsed['warning_count'] === 0) {
          return true;
        }
      }

      // value did not match any of the provided formats, so return false=validation failed
      return false;
    });
  }
}

您稍后可以像这样使用这个新的验证规则:

'trep_txn_date' => 'date_multi_format:"Y-m-d H:i:s.u","Y-m-d"' 

您可以在这里阅读有关如何创建自定义验证规则的更多信息:http://laravel.com/docs/5.1/validation#custom-validation-rules


是的,我正在考虑自定义验证规则,但你展示的方法确实是处理它的好方法。谢谢。 - karmendra
问题在于 date_format 函数允许使用特定格式的 after 和 before 规则,但在此处它们将无法正常工作。 - Vedmant
2
如果您在2020年看到此内容,请使用此内容进行自定义验证规则。这样更加简洁,可以使Authserviceprovider更加清晰。https://laravel.com/docs/7.x/validation#custom-validation-rules - Koushik Das

4

非常有趣。我注意到 validateDateFormat()8.x 中发生了变化,如果我没有记错的话。我认为 @jedrzej.kurylo 的答案仍然有效,因为问题明确提到了 Laravel 5.1。但是你提供的 github 链接非常有趣和有用。也许在你的答案开头加上提及 date_format 规则何时发生变化的说明会更有帮助。 - PeterJames

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接