我正在编写验证器规则,用于在添加新的Eloquent模型记录之前检查数据是否有效。
字符串,小数和整数非常清楚。
但是时间戳字段呢?
我在我的一次数据库迁移中使用timestamp
方法添加了列,它运行正常。我唯一需要的是确保在执行查询之前传递的值是一个有效的时间戳。
是否有直接/简单的方法,还是应该为此编写正则表达式?
谢谢
答案 0 :(得分:3)
我认为像这样验证..
$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 !
}
看起来这条规则很有效。
答案 1 :(得分:1)
使用此规则
public function rules()
{
return [
'date_time' => 'date_format:Y-m-d H:i:s'
];
}
答案 2 :(得分:0)
laravel中没有时间戳的验证规则。 如果您需要验证时间戳,可以使用类似的东西:
function isValidTimeStamp($timestamp)
{
return ((string) (int) $timestamp === $timestamp)
&& ($timestamp <= PHP_INT_MAX)
&& ($timestamp >= ~PHP_INT_MAX);
}
如果在php中生成时间戳,则无需验证它。如果是用户输入,则可以在将其转换为时间戳之前使用laravel validator的date
验证规则。
答案 3 :(得分:0)
您可以尝试使用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方法更难以阅读和维护。
答案 4 :(得分:0)
只需在laravel中创建一个新的验证规则以验证时间戳...
Validator::extend('isTimeStamp', function($attribute, $value, $parameters)
{
return ((string) (int) $value === $value)
&& ($value <= PHP_INT_MAX)
&& ($value >= ~PHP_INT_MAX);
});
您现在可以使用isTimeStamp
验证规则来验证时间戳。