laravel默认的异常处理是展示出异常的界面,不能够完善的捕获异常并响应为json格式数据
需要修改下以下文件
app/Exceptions/Handler.php
<?php
namespace App\Exceptions;
use App\Lib\ApiHelper\ApiCode;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Support\Arr;
use Illuminate\Validation\ValidationException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Throwable;
class Handler extends ExceptionHandler
{
/**
* A list of the exception types that are not reported.
*
* @var array
*/
protected $dontReport = [
//
];
/**
* A list of the inputs that are never flashed for validation exceptions.
*
* @var array
*/
protected $dontFlash = [
'current_password',
'password',
'password_confirmation',
];
/**
* Register the exception handling callbacks for the application.
*
* @return void
*/
public function register()
{
$this->reportable(function (Throwable $e) {
//
});
}
public function render($request, Throwable $e)
{
switch ($e) {
case $e instanceof ValidationException:
$response = [
'errmsg' => Arr::first($e->errors())[0] ?? '请求参数不合法',
'errcode' => ApiCode::FAILED,
'data' => new \stdClass()
];
break;
case $e instanceof HttpException:
$response = [
'errmsg' => ApiCode::getMessage(ApiCode::FAILED_HTTP),
'errcode' => ApiCode::FAILED_HTTP,
'data' => new \stdClass()
];
break;
default:
$code = $e->getCode() ?: ApiCode::FAILED;
$response = [
'errmsg' => $e->getMessage() ?: ApiCode::getMessage($code),
'errcode' => $code,
'data' => new \stdClass()
];
}
if (config('app.debug')) {
$response['exception'] = get_class($e);
$response['message'] = $e->getMessage();
$response['trace'] = $e->getTrace();
}
return response()->json($response,200,[],JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
}
}
ApiCode类
app/Lib/ApiHelper/ApiCode.php
<?php
namespace App\Lib\ApiHelper;
class ApiCode
{
const OK = 20000;
const FAILED_PARAMES = 40001;
const FAILED = 50000;
const FAILED_NO_EXIST = 50001;
const FAILED_AUTH_EXPIRED = 50002;
const FAILED_HTTP = 50003;
public static $messageMapper = [
self::OK => '成功',
self::FAILED => '失败',
self::FAILED_HTTP => 'HTTP请求异常',
self::FAILED_NO_EXIST => '授权码不存在',
self::FAILED_AUTH_EXPIRED => '授权码过期'
];
/**
* Get code message
* @param $code
* @return string
*/
public static function getMessage($code)
{
return self::$messageMapper[$code] ?? '服务器未知错误';
}
}