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

dluptydi  于 2023-01-10  发布在  其他
关注(0)|答案(5)|浏览(155)

如何在注册时检查用户的年龄?我想将最小年龄设置为13岁。我要求输入用户的出生日期,当我验证其他凭据时,我想检查他们是否确实为13岁以上。
我的用户模型摘录如下:

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

如何检查输入的日期是否在13年前或更早?
我已经看到我可以使用Laravel文档中的before:yyy-mm-dd规则,如下所示:

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

1.如何计算价值?
1.如何在规则中使用该值?

eoigrqb6

eoigrqb61#

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

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

jfgube3f2#

您可以使用Laravel附带的Carbon

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

$rules = [
    ...
    'dob' => 'required|date|before:' . $before
];
ulydmbyx

ulydmbyx3#

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
noj0wjuj

noj0wjuj4#

这是一个有点老,但我想分享我做它的方式。

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

使用before很不错,但对最终用户来说有点难看,因为如果今天是他的生日,他将无法通过。使用before_or_equal,您将获得完美的行为。如果您的目标受众是世界各地的用户,一种改进方法是使用Carbon检查时区。

7kjnsjlb

7kjnsjlb5#

我已经成功地实现了这一点,您可以使用
现在()-〉子年份(18)-〉到日期字符串()

$validator = Validator::make($request->all(), [
                
                'birthdate' => 'required|date|before:'.now()->subYears(18)->toDateString(),
                
            ], [
                'birthdate.before' => trans('18 year validation'),                
            ]);

相关问题