【问题标题】:Check user's age with laravel validation rules使用 laravel 验证规则检查用户的年龄
【发布时间】:2014-05-29 16:27:23
【问题描述】:

如何在注册时查看用户的年龄?我想将最低年龄设置为 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. 如何在规则中使用该值?

【问题讨论】:

    标签: validation laravel model


    【解决方案1】:

    你可以使用 laravel 自带的 Carbon

    $dt = new Carbon\Carbon();
    $before = $dt->subYears(13)->format('Y-m-d');
    
    $rules = [
        ...
        'dob' => 'required|date|before:' . $before
    ];
    

    【讨论】:

    • 我把这个放在哪里?在模型上?
    • 无论您在哪里进行验证,基本上都是使用 Carbon 确定 13 年前的日期,然后使用它来创建您的规则数组
    【解决方案2】:

    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
    

    【讨论】:

    • 谢谢,我稍后会考虑这个问题,因为它目前正在使用@RMcLeod 的答案,我只想检查他们是 13 岁。
    • 验证扩展在哪里?
    • 无论你想把它放在哪里,添加带有你的自定义扩展的文件,将它附加到路由、全局等。这完全取决于你和你如何组织你的代码。我肯定会选择类似 `app/YourFolder/Validation/rules.php
    • 顺便说一句,答案很好,只是注意当dob日期大于今天日期时我遇到问题,验证将返回true,因为使用diff( ) 功能。对于有此问题的人,请在 dobbefore:today 中添加另一个规则,然后一切正常。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案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 检查时区。

      【讨论】:

      • 谢谢,但该验证规则仅在 Laravel 5.4 中引入,当我问 Laravel 4 是最新版本时。但是,是的,今天会很好用!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 2019-10-11
      • 1970-01-01
      • 2018-10-14
      • 2014-05-20
      • 2014-03-29
      • 1970-01-01
      相关资源
      最近更新 更多