场景:
1.现在有个医疗小程序,里面有医生和患者角色可任意切换平台角色。
2.我分别用缓存了标识分别是'patient'和'doctor'。
3.医生(doctor)有分支角色、例如院内、院外、合作伙伴等用户角色。
4.患者(patient)是没有分支用户角色的。
5.表结构:用户总表user
、医生表user_doctor
、患者表user_patient
。
6.user
表是存放微信的unid和openid等公共信息。
7.user_doctor
表是存放医生个人信息、简介、医生头像。
8.user_patient
表是存放患者姓名、患者头像。
9.每次request请求都带平台角色标识回后台。
问题:
写业务代码的时候发现很麻烦,每次都要分别判断一下平台角色再处理业务逻辑,如果以后有其他主角色维护会很多地方都要修改,例如下面代码:
角色相互绑定方法:
public function bindOther(){
$param = Request()->param();
switch ($this->platformRole){
// 从医生绑定患者
case 1:
$doctorID = $this->auth->_user->doctor_id;
$patientID = $param['other_id'];
break;
case 2:
$doctorID = $param['other_id'];
$patientID = $this->auth->_user->patient_id;
break;
}
Db::startTrans();
try {
// 插入关系记录
$this->PatientAccessModel->bindRelationship($patientID, $doctorID);
Db::commit();
}catch (Exception $e){
Db::rollback();
$this->error($e->getMessage(), [], API_FAIL);
}
$this->success('绑定成功', [], API_SUCCESS);
}
业务没说太明白。
一、简单方式,就是将判断用户角色的代码抽象成一个公共工具类(RoleManageUtil)和对应判断的方法。
所有判断调用此方法。后期扩展或修改,只要改这一个工具类的方法即可。
二、进阶方式:增加一个判断用户角色的Filter,并讲用户的身份信息透传到业务层,有一些代码侵入,性能会略有损耗,但代码会比较优雅和简洁。