+-
我想问下场景问题,如何合理设计角色问题。

场景:
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,并讲用户的身份信息透传到业务层,有一些代码侵入,性能会略有损耗,但代码会比较优雅和简洁。

是否可以考虑面向接口编程呢?