一般来说,我们的接口会设计如下
public function login(Request $request)
{
if(某个条件真){
return response()->json([
'code' => '0',
]);
}else{
return response()->json([
'code' => '1',
'msg'=>'xx错误'
]);
}
}
如果有很多个if…else时:
// 如果很多个if...else判断的情况下
public function login(Request $request)
{
if(某个条件真){
return response()->json([
'code' => '0',
]);
}else if(xxx){
return response()->json([
'code' => '1',
'msg'=>'xx错误'
]);
}
// 某个函数执行结果
else if(!foo()){
return response()->json([
'code' => '1',
'msg'=>'yy错误'
]);
}
...
}
function foo(){
if(xx){
return true;
}else{
return false;
}
}
这种return的情况在controller中还好,如果controller还依赖其他函数的返回结果,那么代码就很臃肿,如果那个步骤忘了return,那么客户端就收不到任何相应!
那么我们如何优化这种情况呢?
答案是使用异常
我们仅仅需要定义一个exception
class DefaultException extends Exception
{
public function __construct($message, $code)
{
parent::__construct($message, $code);
}
// 这个方法必须,重定义异常捕获时的response
public function render(Request $request)
{
return response()->json([
'code' => '1',
'message' => $this->message
]);;
}
}
那么在代码的任何地方
throw new DefaultException("xx错误", "400");
改造后的接口如下:
// 如果很多个if...else判断的情况下
public function login(Request $request)
{
if(某个条件真){
return response()->json([
'code' => '0',
]);
}else if(xxx){
throw new DefaultException("xx错误", "400");
}
...
}
function foo(){
if(!xx){
throw new DefaultException("xx错误", "400");
}
}
清爽~舒服
ok,如此一来,我们接口逻辑或某个函数不通的时候,就不依赖return了,而是直接throw,爽!
而且DefaultException可以改造为任何其他类型的exception,比如用户模块(UserException),扩展性极强!