【问题标题】:Validate a timestamp value in laravel 5在 laravel 5 中验证时间戳值
【发布时间】:2015-07-29 20:42:58
【问题描述】:

我正在编写验证器规则,用于在添加新的 Eloquent 模型记录之前检查数据是否有效。

字符串、小数和整数都很清楚。

但是时间戳字段呢?

我在我的一个数据库迁移中使用timestamp 方法添加了该列,它工作得很好。我唯一需要的是确保在执行查询之前传递的值是一个有效的时间戳。

是否有直接/简单的方法或者我应该为此编写一个正则表达式?

谢谢

【问题讨论】:

  • 有的话我没见过。我使用正则表达式。

标签: validation laravel laravel-5


【解决方案1】:

我认为像这样验证..

$rules = ['start_at' => 'date_format:Y-m-d H:i:s'];

让我们测试一下这条规则

public function testSimpleTimeStampValidation()
{

    $data = ['start_at'  => '2015-12-1 12:12:58'];


    $rules = ['start_at' => 'date_format:Y-m-d H:i:s'];

    $validator = \Validator::make($data, $rules);

    $this->assertTrue($validator->passes()); // passed !        
}

再次尝试使用不需要的日期格式进行测试..

public function testSimpleTimeStampValidation()
{

    $data = ['start_at'  => '12-1-2015 12:12:58'];


    $rules = ['start_at' => 'date_format:Y-m-d H:i:s'];

    $validator = \Validator::make($data, $rules);

    $this->assertTrue($validator->passes()); // Failed !        
}

看起来这个规则很有效..

更多详情Data Format Validation in L5

【讨论】:

  • 这可能有效。我必须一段时间再回到这个问题上,看看我在将近 2 个月前做了什么。谢谢
  • 我已经在 PHPUnit 测试中测试过了。我确定“date_format:Y-m-d H:i:s”规则也有效
【解决方案2】:

使用这条规则

   public function rules()
    {
        return [
            'date_time' => 'date_format:Y-m-d H:i:s'
        ];
    }

【讨论】:

    【解决方案3】:

    laravel 中没有时间戳的验证规则。 如果您需要验证时间戳,您可以使用类似的东西:

    function isValidTimeStamp($timestamp)
    {
        return ((string) (int) $timestamp === $timestamp) 
            && ($timestamp <= PHP_INT_MAX)
            && ($timestamp >= ~PHP_INT_MAX);
    }
    

    如果您在 php 中生成时间戳,则无需验证它。如果是用户输入,您可以在将其转换为时间戳之前使用laravel validatordate 验证规则。

    【讨论】:

      【解决方案4】:

      您可以尝试使用Carbon 为您解析时间戳,然后以易于阅读的方式运行验证:

      $date = Carbon::createFromTimeStamp( (int) $timestamp );
      $min = Carbon::create( 2014, 12, 31, 23, 59, 59 );
      $max = Carbon::create( 2015, 12, 31, 23, 59, 59 );
      return $date->gt( $min ) && $date->lte( $max );
      

      不过,为了实际验证原始时间戳本身,除了对原始数字做与上述相同的事情之外,我没有什么能想出的:

      return 1420030799 < $timestamp && $timestamp <= 1451566799;
      

      但这比 Carbon 方法更难阅读和维护。

      【讨论】:

        【解决方案5】:

        只需在 laravel 中创建一个新的验证规则来验证时间戳...

        Validator::extend('isTimeStamp', function($attribute, $value, $parameters)
        {
            return ((string) (int) $value === $value) 
                   && ($value <= PHP_INT_MAX)
                   && ($value >= ~PHP_INT_MAX);
        });
        

        您现在可以使用isTimeStamp 验证规则来验证时间戳。

        【讨论】:

        • (string) (int)$value 之前做了什么?
        • @IvankaTodorova $value 被认为是一个字符串,所以首先,你将 $value 转换为一个 int (所以“123”将成为整数 123,但“a_string”将成为整数 0)。然后再次将先前转换的值再次转换为字符串(因此 int 123 变为“123”),并将其与初始值进行比较,只有真正的 int 仍将包含初始值。请注意,在这种情况下,我也会强制转换 (string)$value。这来自stackoverflow.com/questions/2524680/…
        猜你喜欢
        • 2022-11-24
        • 2021-04-13
        • 2021-12-01
        • 2016-05-29
        • 2017-08-29
        • 2020-08-29
        • 1970-01-01
        • 2012-09-07
        • 2016-08-05
        相关资源
        最近更新 更多