我们写接口时,往往需要根据业务逻辑返回给客户端一些异常信息,在laravel框架中实现很简单
1在.app/Exceptions/Handler.php中重写
Illuminate\Foundation\Exceptions\Handler的convertExceptionToArray
方法,该方法源码
protected function convertExceptionToArray(Exception $e)
{
return config('app.debug') ? [
'message' => $e->getMessage(),
'exception' => get_class($e),
'file' => $e->getFile(),
'line' => $e->getLine(),
'trace' => collect($e->getTrace())->map(function ($trace) {
return Arr::except($trace, ['args']);
})->all(),
] : [
'message' => $this->isHttpException($e) ? $e->getMessage() : 'Server Error',
];
}
重写此方法主要是为了加入错误码如
{
"message": "您还没有通过认证",
"code": 1003
}
app/Exceptions/Handler.php重写加入code参数
protected function convertExceptionToArray(Exception $e)
{
return config('app.debug') ? [
'message' => $e->getMessage(),
'code' => $e->getCode(),
'exception' => get_class($e),
'file' => $e->getFile(),
'line' => $e->getLine(),
'trace' => collect($e->getTrace())->map(function ($trace) {
return Arr::except($trace, ['args']);
})->all(),
] : [
'message' => $this->isHttpException($e) ? $e->getMessage() : 'Server Error',
'code' => $e->getCode(),
];
}
抛出异常 在控制器中经常要根据逻辑抛出异常,因此我们在控制器的基类Controller
定义errorResponse
方法
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller as BaseController;
use Symfony\Component\HttpKernel\Exception\HttpException;
class Controller extends BaseController
{
public function errorResponse($statusCode, $message=null, $code=0)
{
throw new HttpException($statusCode, $message, null, [], $code);
}
}
这样我们在任何控制器都能使用$this->errorRespons()
示例
public function store(TopicRequest $request, Topic $topic)
{
return $this->errorResponse(403,'测试',1101);//测试抛出异常
$topic->fill($request->all());
$topic->user_id = $request->user()->id;
$topic->save();
return new TopicResource($topic);
}