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

Mik*_*ike 6 validation model laravel

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

我的User模型的摘录如下所示:

$rules = [
            'name'                  => 'required|alpha|min:1',
            'email'                 => 'required|email|unique:users',
            'dob'                   => 'required|date'
         ];
Run Code Online (Sandbox Code Playgroud)

如何检查输入的日期是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'
         ];
Run Code Online (Sandbox Code Playgroud)
  1. 我该如何计算价值?
  2. 如何在规则中使用该值?

Zan*_*n13 18

检查日期比N年更大(更旧)的简单方法是将before规则设置为减去N年.

$rules = [
    'dob' => 'required|date|before:-13 years',
]
Run Code Online (Sandbox Code Playgroud)

  • 这真太了不起了。我发现它比任何其他答案更有价值。 (2认同)

Jar*_*zyk 12

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;
});
Run Code Online (Sandbox Code Playgroud)

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

$rules = ['dob' => 'olderThan']; // checks for 13 years as a default age
$rules = ['dob' => 'olderThan:15']; // checks for 15 years etc
Run Code Online (Sandbox Code Playgroud)


RMc*_*eod 7

您可以使用带有laravel的Carbon

$dt = new Carbon\Carbon();
$before = $dt->subYears(13)->format('Y-m-d');

$rules = [
    ...
    'dob' => 'required|date|before:' . $before
];
Run Code Online (Sandbox Code Playgroud)


App*_*pha 5

这有点旧,但是我想分享我的做法。

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

使用before是不错的方法,但对最终用户来说却有点丑陋,因为如果今天是他的生日,他将无法通过。与before_or_equal您一起获得完美的行为。如果您针对全球受众,那么一种改善此问题的方法就是使用Carbon来检查时区。