使用laravel验证规则检查用户的年龄

时间:2014-04-15 10:57:27

标签: validation laravel model

如何在注册时查看用户的年龄?我想将最低年龄设定为13岁。我询问用户的出生日期,当我验证其他凭据时,我想检查他们实际上是13 +。

我的用户模型的摘录如下所示:

$rules = [
            'name'                  => 'required|alpha|min:1',
            'email'                 => 'required|email|unique:users',
            'dob'                   => 'required|date'
         ];

如何检查输入的日期是否在13年前或更长时间?

我已经看到我可以使用Laravel Docs中的before:yyy-mm-dd规则,如下所示:

$rules = [
            'name'                  => 'required|alpha|min:1',
            'email'                 => 'required|email|unique:users',
            'dob'                   => 'required|date|before:2001-04-15'
         ];
  1. 如何计算价值?
  2. 如何在规则中使用该值?

3 个答案:

答案 0 :(得分:16)

检查日期是否大于(年龄)大于N年的简单方法是将before规则设置为减去N 年。

$rules = [
    'dob' => 'required|date|before:-13 years',
]

答案 1 :(得分:11)

RMcLeod的回答没问题,但我建议您将其解压缩为自定义规则:

Validator::extend('olderThan', function($attribute, $value, $parameters)
{
    $minAge = ( ! empty($parameters)) ? (int) $parameters[0] : 13;
    return (new DateTime)->diff(new DateTime($value))->y >= $minAge;

    // or the same using Carbon:
    // return Carbon\Carbon::now()->diff(new Carbon\Carbon($value))->y >= $minAge;
});

通过这种方式,您可以将规则用于您喜欢的任何年龄:

$rules = ['dob' => 'olderThan']; // checks for 13 years as a default age
$rules = ['dob' => 'olderThan:15']; // checks for 15 years etc

答案 2 :(得分:4)

这有点旧,但我想分享我这样做的方式。

 public function rules()
{
    return 
    [
        ...
        'age' => 'required|date|before_or_equal:'.\Carbon\Carbon::now()->subYears(18)->format('Y-m-d'),
        ...
    ];
}

使用before很不错但对最终用户来说有点难看,因为如果今天是他的生日,他将无法通过。使用before_or_equal,您可以获得完美的行为。如果您针对全球观众,那么改善这种情况的方法就是使用Carbon检查时区。