Thinkphp 在api开发中异常返回依然是html的解决方式

现在谁不开发接口的呢?但是在接口开发过程中,报错误异常后居然返回错误的信息依然是html信息!TP官方也不知道为啥不添加,说好的为接口而生,我的解决方案也很简单,把系统的异常处理类复制出来,去掉模板相关,直接以json方式输出

下面是解决方案:

1:按照TP扩展异常的方式引用这个文件

https://www.kancloud.cn/manual/thinkphp5_1/354092

// 判断默认输出类型// $app 是配置数组if ($app['default_return_type'] == 'json') { // 异常处理handle类 留空使用 \think\exception\Handle $app['exception_handle'] = '\\app\\common\\exception\\JsonException';}return $app;

异常处理类:

<?php  namespace app\common\exception;   use Exception; use think\exception\ErrorException; use think\exception\Handle; use think\exception\HttpException; use think\console\Output; use think\Container; use think\Response;   class JsonException extends Handle{  protected $render;  protected $ignoreReport = [   '\\think\\exception\\HttpException',  ];   public function setRender($render){   $this->render = $render;  }   /**  * Report or log an exception.  *  * @access public  * @param \Exception $exception  * @return void  */  public function report(Exception $exception){   if (!$this->isIgnoreReport($exception)) {   // 收集异常数据   if (Container::get('app')->isDebug()) {    $data = [     'file' => $exception->getFile(),     'line' => $exception->getLine(),     'message' => $this->getMessage($exception),     'code' => $this->getCode($exception),    ];    $log = "[{$data['code']}]{$data['message']}[{$data['file']}:{$data['line']}]";   } else {    $data = [     'code' => $this->getCode($exception),     'message' => $this->getMessage($exception),    ];    $log = "[{$data['code']}]{$data['message']}";   }    if (Container::get('app')->config('log.record_trace')) {    $log .= "\r\n" . $exception->getTraceAsString();   }    Container::get('log')->record($log, 'error');   }  }   protected function isIgnoreReport(Exception $exception){   foreach ($this->ignoreReport as $class) {   if ($exception instanceof $class) {    return true;   }   }    return false;  }   /**  * Render an exception into an HTTP response.  *  * @access public  * @param \Exception $e  * @return Response  */  public function render(Exception $e){   if ($this->render && $this->render instanceof \Closure) {   $result = call_user_func_array($this->render, [$e]);    if ($result) {    return $result;   }   }    if ($e instanceof HttpException) {   return $this->renderHttpException($e);   } else {   return $this->convertExceptionToResponse($e);   }  }   /**  * @access public  * @param Output $output  * @param Exception $e  */  public function renderForConsole(Output $output, Exception $e){   if (Container::get('app')->isDebug()) {   $output->setVerbosity(Output::VERBOSITY_DEBUG);   }    $output->renderException($e);  }   /**  * @access protected  * @param HttpException $e  * @return Response  */  protected function renderHttpException(HttpException $e){   $status = $e->getStatusCode();   $template = Container::get('app')->config('http_exception_template');    if (!Container::get('app')->isDebug() && !empty($template[$status])) {   return Response::create($e, 'json', $status);   } else {   return $this->convertExceptionToResponse($e);   }  }   /**  * @access protected  * @param Exception $exception  * @return Response  */  protected function convertExceptionToResponse(Exception $exception){   // 收集异常数据   if (Container::get('app')->isDebug()) {   // 调试模式,获取详细的错误信息   $data = [    'name' => get_class($exception),    'file' => $exception->getFile(),    'line' => $exception->getLine(),    'message' => $this->getMessage($exception),    'trace' => $exception->getTrace(),    'code' => $this->getCode($exception),    'source' => $this->getSourceCode($exception),    'datas' => $this->getExtendData($exception),    'tables' => [     'GET Data'    => $_GET,     'POST Data'    => $_POST,     'Files'     => $_FILES,     'Cookies'    => $_COOKIE,     'Session'    => isset($_SESSION) ? $_SESSION : [],     'Server/Request Data' => $_SERVER,     'Environment Variables' => $_ENV,     'ThinkPHP Constants' => $this->getConst(),    ],   ];   } else {   // 部署模式仅显示 Code 和 Message   $data = [    'code' => $this->getCode($exception),    'message' => $this->getMessage($exception),   ];    if (!Container::get('app')->config('show_error_msg')) {    // 不显示详细错误信息    $data['message'] = Container::get('app')->config('error_message');   }   }    //保留一层   while (ob_get_level() > 1) {   ob_end_clean();   }    $data['echo'] = ob_get_clean();    $response = Response::create($data, 'json');    if ($exception instanceof HttpException) {   $statusCode = $exception->getStatusCode();   $response->header($exception->getHeaders());   }    if (!isset($statusCode)) {   $statusCode = 500;   }   $response->code($statusCode);    return $response;  }   /**  * 获取错误编码  * ErrorException则使用错误级别作为错误编码  * @access protected  * @param \Exception $exception  * @return integer    错误编码  */  protected function getCode(Exception $exception){   $code = $exception->getCode();    if (!$code && $exception instanceof ErrorException) {   $code = $exception->getSeverity();   }    return $code;  }   /**  * 获取错误信息  * ErrorException则使用错误级别作为错误编码  * @access protected  * @param \Exception $exception  * @return string    错误信息  */  protected function getMessage(Exception $exception){   $message = $exception->getMessage();    if (PHP_SAPI == 'cli') {   return $message;   }    $lang = Container::get('lang');    if (strpos($message, ':')) {   $name = strstr($message, ':', true);   $message = $lang->has($name) ? $lang->get($name) . strstr($message, ':') : $message;   } elseif (strpos($message, ',')) {   $name = strstr($message, ',', true);   $message = $lang->has($name) ? $lang->get($name) . ':' . substr(strstr($message, ','), 1) : $message;   } elseif ($lang->has($message)) {   $message = $lang->get($message);   }    return $message;  }   /**  * 获取出错文件内容  * 获取错误的前9行和后9行  * @access protected  * @param \Exception $exception  * @return array     错误文件内容  */  protected function getSourceCode(Exception $exception){   // 读取前9行和后9行   $line = $exception->getLine();   $first = ($line - 9 > 0) ? $line - 9 : 1;    try {   $contents = file($exception->getFile());   $source = [    'first' => $first,    'source' => array_slice($contents, $first - 1, 19),   ];   } catch (Exception $e) {   $source = [];   }    return $source;  }   /**  * 获取异常扩展信息  * 用于非调试模式html返回类型显示  * @access protected  * @param \Exception $exception  * @return array     异常类定义的扩展数据  */  protected function getExtendData(Exception $exception){   $data = [];    if ($exception instanceof \think\Exception) {   $data = $exception->getData();   }    return $data;  }   /**  * 获取常量列表  * @access private  * @return array 常量列表  */  private static function getConst(){   $const = get_defined_constants(true);    return isset($const['user']) ? $const['user'] : [];  }  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值