热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Larave开发Dingo处理自定义Exception时render不生效【解决】

1.不使用DingoApi进自定义Exception的处理方式是首先定义Exception类,如AppExceptionsApiExceptionnamespaceApp\Exce

1.不使用Dingo Api进自定义Exception的处理方式是

首先定义Exception类,如AppExceptionsApiException

namespace App\Exceptions;
use Exception;
use Throwable;
class ApiException extends Exception
{
public function __construct(string $message = "", int $code = 1, Throwable $previous = null)
{
parent::__construct($message, $code, $previous);
}
}

其次在AppExceptionsHandler中针对Exception处理

public function render($request, Exception $exception)

{
if ($exception instanceof ApiException) {
return response()->json(['status'=>$exception->getCode(), 'msg'=> $exception->getMessage()]);//自定义返回
}
return parent::render($request, $exception);
}

最后在使用时,throw new ApiException(‘请求出错’, 123);

2.在使用Dingo api处理接口时,发现laravel本身appExceptionsHandler中无法捕获异常, render无法生效了,原因是Dingo 接管了Exception,解决如下

首先重新定义一个Handler类

namespace App\Exceptions;
use Exception;
use Dingo\Api\Exception\Handler as DingoHandler;
class ApiHandler extends DingoHandler
{
public function handle(Exception $exception)
{
if ($exception instanceof ApiException) {
return ['status'=>$exception->getCode(), 'msg'=> $exception->getMessage()];//自定义返回,注意此处不能使用response()返回了,因为Dingo封装处理了,全部当code为500返回,所以此处应直接返回array,
}
return parent::handle($exception);
}
}

其次注册处理类,可直接在AppProvidersAppServiceProvider->boot函数中添加(本例采用此方法),也可以自定义一个Provider,然后在config/app.php的providers数组中添加进去

public function boot()
{
// 自定义错误处理
$this->app->alias('api.exception', 'App\Exceptions\ApiHandler');
$this->app->singleton('api.exception', function ($app) {
return new \App\Exceptions\ApiHandler($app['Illuminate\Contracts\Debug\ExceptionHandler'],
$app['config']['api.errorFormat'], $app['config']['api.debug']);
});
}

最后在使用时,throw new ApiException(‘请求出错’, 123);


推荐阅读
  • 在实际开发中,现在安卓端和后台之间的数据交互,一般都是用JSON来传递数据信息。JSON大家一般都比较熟悉。我这边就以实际项目中的后台传过来的情况和大家分析下及如何处理。比如后台返 ... [详细]
  • Gson转换json数据为对象
    可以通过Gson使用两种方法,将json字符串转换为对象,以下面该段报文做测试{id:84041462,lastName:小华,age:32 ... [详细]
  • 在Oracle中执行动态SQL的几种方法在一般的sql操作中,sql语句基本上都是固定的,如:SELECTt.empno,t.ename FROMscott.emptWHEREt. ... [详细]
  • PHPcURL获取微信公众号access_token的实例php实例:这篇文章主要介绍了PHPcURL获取微信公众号access_token的实例,需要的朋友可以参考下1.开发微信 ... [详细]
  • 在这一期的SendMessage函数应用中,我将向大家介绍如何利用消息函数来扩展树型列表(TreeView)控件的功能相信对于树型列表控件大家十分的熟悉, ... [详细]
  • 强化学习(1): 概述
    一、强化学习描述1.算法定义强化学习算法是在不确定环境中,通过与环境的不断交互,来不断优化自身策略的算法。2.算法特点数据是序列分布而非独立同分 ... [详细]
  • Icurrentlyhaveafunction[C#]whichtakesabyte[]andanalignmenttosetitto,butduringencr ... [详细]
  • 普通调用https:www.cnblogs.comYogurshinep3913073.htmlhttps:zhidao.baidu.comquestion531286375.h ... [详细]
  • spotify engineering culture part 1
    原文,因为原视频说的太快太长,又没有字幕,于是借助youtube,把原文听&打出来了。中文版日后有时间再翻译。oneofthebigsucceessfactorshereatSpo ... [详细]
  • 最近想用js做一个简单的计算器,不过网上的例子好像大部分都是直接从左到右挨个计算,就好像1+2*5,就会先计算1+2,再计算3*5,并没有实现运算符的优先级,这里找到了一种方法实现,来总结一下。不过这 ... [详细]
  • 元类print(type(abc))print(type(True))print(type(100))print(type([1,2,3]))print(type({na ... [详细]
  • 下面是一个用openssl实现获取https网页内容的demo,整个流程比较简单,主要封装的API如下staticinthttps_init(http ... [详细]
  • 字符串匹配: BF与KMP算法
    文章目录一.BF算法1.算法思想2.代码实现二.KMP算法1.算法思想概述2.理解基于最长相等前后缀进行匹配3.代码中如何实现next数组5.代码实现6.next数组的优化一.BF ... [详细]
  • 一、使用ContentProvider(内容提供者)共享数据ContentProvider在android中的作用是对外共享数据,也就是说 ... [详细]
  • 开发笔记:Xunit测试使用个人小结
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Xunit测试使用个人小结相关的知识,希望对你有一定的参考价值。因工作中用到xunit测试,故总结下用法,以供个人参考使 ... [详细]
author-avatar
X53TEDDYWON_314
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有