【问题标题】:Carbon (laravel) deal with invalid dateCarbon(laravel)处理无效日期
【发布时间】:2018-03-31 10:23:23
【问题描述】:

我有一个非常简单的问题。我将Carbon::parse($date) 函数与$date = '15.15.2015' 一起使用。当然它不能返回一个有效的字符串,因为没有第 15 个月。但是我怎么能“忽略”错误信息呢? 很棒的东西就像

if (Carbon::parse($date) != error) Carbon::parse($date);
else echo 'invalid date, enduser understands the error message';

【问题讨论】:

    标签: php laravel exception error-handling php-carbon


    【解决方案1】:

    您可以像这样捕获 Carbon 引发的异常:

    try {
        Carbon::parse($date);
    } catch (\Exception $e) {
        echo 'invalid date, enduser understands the error message';
    }
    

    后期编辑:从 2020 年 5 月 13 日发布的 Carbon 版本 2.34.0 开始,抛出了一种新型异常:Carbon\Exceptions\InvalidFormatException

    因此,如果您使用的是较新版本的 Carbon,您实际上可以更优雅地做到这一点

    try {
        Carbon::parse($date);
    } catch (\Carbon\Exceptions\InvalidFormatException $e) {
        echo 'invalid date, enduser understands the error message';
    }
    

    感谢 Christhofer Natalius 指出这一点!

    【讨论】:

    • 您应该将它包含在您想要验证日期并显示错误消息的任何位置,这取决于您对该请求还做了什么。我需要您的整个控制器功能才能提供更有帮助的答案。
    • 你不应该像这个 (\Exception) 那样捕获异常,否则你可能会错过潜在的编程错误
    • 很公平。我应该捕获什么异常?哦等等,DateTime 构造函数只抛出一般异常。至少在插入无用的 cmets 并拒绝一个完全有效的答案之前做你的研究。
    • 现在我们可以使用 Carbon\Exceptions\InvalidFormatException,idk,因为这个异常存在时。
    • 此功能在某些情况下无法正常工作。例如,如果 $date = 30 则将其视为有效日期,但它不是有效日期。有效日期的格式应为“0000-00-00”
    【解决方案2】:

    在使用之前传递Laravel's validation。像这样创建一个验证器:

         protected function validator(array $data)
    {
        //$data would be an associative array like ['date_value' => '15.15.2015']
        $message = [
            'date_value.date' => 'invalid date, enduser understands the error message'
        ];
        return Validator::make($data, [
            'date_value' => 'date',
        ],$message);
    }
    

    并在使用你的约会之前给他打电话:

    $this->validator(['date_value' => $date])->validate();
    // $this->validator(request()->all())->validate(); you can pass the whole request if fields names are the same
    
    Carbon::parse($date);
    

    您可以将所有需要的字段添加到验证器并应用多个验证来处理每条消息或使用默认消息。如果您正在验证用户的输入,这将是一种方式

    【讨论】:

    • 谢谢!我把protected function放在哪里?
    • 在控制器内部接收$date 或任何您想用来验证传入请求/数据的文件。记得使用:use Illuminate\Support\Facades\Validator;
    • 非常感谢!是的,收到消息并自己查找了它。它有效,非常感谢!
    【解决方案3】:

    试试这个

    $birth_date = Carbon::createFromFormat('dmy', $birth_date_mark)->startOfDay();
    if ($birth_date->format('dmy') !== $birth_date_mark) {
         throw new OperationException(trans('exception.invalid_birth_date'));
    }
    

    【讨论】:

      【解决方案4】:

      另一种解决方案是全局处理异常。

      • 在 app/Exceptions/Handler.php 中
      use Carbon\Exceptions\InvalidFormatException;
      
      • 然后在 render 方法中检查 Carbon 是否抛出异常
          if ($exception instanceof InvalidFormatException) {
                  return response()->json([
                      'status' => 'fail',
                      'data' => [
                          'message' => 'Invalid date formate!'
                      ]
                  ], 400);
              }
      

      【讨论】:

        猜你喜欢
        • 2018-01-10
        • 2016-12-01
        • 2018-07-04
        • 2016-04-30
        • 2014-05-20
        • 1970-01-01
        • 2019-11-06
        • 2016-02-28
        • 1970-01-01
        相关资源
        最近更新 更多