php优雅输出,优雅的输出错误-assert

在正常情况,我们会通过,if,else进行判断一个接口的条件是否满足,不满足则输出错误,例如

在IM系统中,申请入群接口,需要以下判断:$param = $this->request()->getRequestParam();

$groupModel = new UserGroupModel();

//获取群信息

$groupInfo = $groupModel->getOneByGroupHash($param['groupHash']);

if (empty($groupInfo)){

$this->writeJson(HttpStatus::CODE_BAD_REQUEST, [], '群组数据不存在');

return true;

}

//判断被封

if($groupInfo->state!=1){

$this->writeJson(HttpStatus::CODE_BAD_REQUEST, [], '群已经被封');

return true;

}

//判断是否为本群成员

$groupUserModel = new GroupUserModel();

$userInfo = $groupUserModel->getOneByGroupIdAndUserId($groupInfo->groupId, $this->who->userId);

if ($userInfo){

$this->writeJson(HttpStatus::CODE_BAD_REQUEST, [], '你已经是本群成员');

return true;

}

可以看出,这里面有着非常多的if else,return,writeJson等重复代码.那么,有没有一个办法,进行if,else等封装,直接一行代码实现 判断+输出错误呢?

assert断言

断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。

断言比较常见的场景在于unit单元测试,例如在easyswoole/redis组件中的tests 单元测试用例中:

dd4f49dc34d60b6c33cf0ce2d16aaaf9.png

在此示例中,可以看出,断言的作用在于确保程序的正常执行,如果出错则代表程序有问题,需要修bug

业务断言

我们可以通过断言(确保其条件正确,使得程序往下执行)的说法,在业务中封装:function assert($condition,$msg){

//断言条件一定满足,不满足则抛出异常

if ($condition!==true){

throw new Exception($msg);

}

}

上面的代码优化:$param = $this->request()->getRequestParam();

$groupModel = new UserGroupModel();

//获取群信息

$groupInfo = $groupModel->getOneByGroupHash($param['groupHash']);

//注意1:我们需要断言的是true,!!的作用是将正常数据转为bool类型

//断言一定存在groupInfo

assert(!!$groupInfo,'群组数据不存在');

//断言state一定为1

assert($groupInfo->state==1,'群组数据不存在');

//判断是否为本群成员

$groupUserModel = new GroupUserModel();

$userInfo = $groupUserModel->getOneByGroupIdAndUserId($groupInfo->groupId, $this->who->userId);

//断言一定不在群里

assert(!$userInfo,'你已经是本群成员');

在此时,我们已经将我们的判断代码,优化成了一行,在assert函数中,会将不符合预期的数据,通过异常抛出,我们需要通过拦截异常,来实现输出前端需要的数据格式:try{

$param = $this->request()->getRequestParam();

$groupModel = new UserGroupModel();

//获取群信息

$groupInfo = $groupModel->getOneByGroupHash($param['groupHash']);

//注意1:我们需要断言的是true,!!的作用是将正常数据转为bool类型

//断言一定存在groupInfo

assert(!!$groupInfo,'群组数据不存在');

//断言state一定为1

assert($groupInfo->state==1,'群组数据不存在');

//判断是否为本群成员

$groupUserModel = new GroupUserModel();

$userInfo = $groupUserModel->getOneByGroupIdAndUserId($groupInfo->groupId, $this->who->userId);

//断言一定不在群里

assert(!$userInfo,'你已经是本群成员');

}catch (\Throwable $throwable){

//拦截抛出的异常,然后直接输出json 错误消息

$this->writeJson(HttpStatus::CODE_BAD_REQUEST, [], $throwable->getMessage());

return true;

}

注意:上面的代码为简单实现,如果需要在项目中使用,请实现自定义异常类,捕捉自定义的异常,相关较为完善的代码已开源:

其他

需要注意的是,断言的意思为:  断定条件为真,使代码继续往下执行,断言抛出异常为,条件错误才抛出.

如果觉得拗口,可以改为logicCheck,直接判断为真则抛出异常即可

本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值