laravel有一套方便的错误采集和报错机制,如果是开发api的时候我们不需要报错页面显示的那么详细,只想返回一些错误信息,而不用把所有的响应信息都返回到 controller 当中才行

之前的步骤是:

1
router->beforeMiddlware->controller->someService->controller->afterMiddleware-> yourInfo

我们想在这任何一个环节报错的时候都能停止掉运行流程直接返回信息 就需要接下来要说的一个类 Exception

我们自定义的错误文件也是都放在 app/Exception 当中,比如我自定义一个 TestException

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php

namespace App\Exceptions;

class TestException extends \Exception
{
    public function responseJson(){
        $msg = config('errors.user.'.$this->getMessage());
        return \ApiResponse::error($msg);
    }
}

这里面我自定义了一个responseJson()的方法,为了处理我返回的信息

然后我在同文件夹下的 Handler.php 我们返回的错误在这里集中处理

这里的两个方法report()render()

report()会优先执行,用于将错误发送到第三方服务中去,render()就是最终要返回的结果,我们的目标就是这个函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
/**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $e
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $e)
    {
        if($e instanceof TestException){
            return $e->responseJson();
        }
        return parent::render($request, $e);
    }

这里用了instanceof进行比较,如果是来自TestException的报错就会执行我们刚才自定义好的方法,内容当然也可以随便定义了

怎么使用呢?

只需要在控制器中任何你需要报错的地方

1
throw new TestException('system_busy');

括号内的内容可以通过它的getMessage()方法获得

参考文档