BaseGlobal.php 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. namespace common\globals;
  3. use common\enums\RedisKeyEnum;
  4. use common\models\common\AddonsInvoker;
  5. use common\traits\ErrorTrait;
  6. use Exception;
  7. use ReflectionMethod;
  8. abstract class BaseGlobal
  9. {
  10. use ErrorTrait;
  11. /**
  12. * 发起全局调用
  13. * @param [type] $invoke_id
  14. * @param [type] $addons_list
  15. * @param [type] $params
  16. * @return void
  17. */
  18. public function handle($invoke_id,$addons_list,$params=[]){
  19. $params['invoke_id'] = $invoke_id;
  20. $redis = \Yii::$app->redis;
  21. $redis_key = RedisKeyEnum::suffix(RedisKeyEnum::GLOBAL_INVOKE, '',true) .':'. $invoke_id;
  22. $invokes = $redis->smembers($redis_key);
  23. if(empty($invokes)){
  24. $invokes = AddonsInvoker::getList($invoke_id,$addons_list);
  25. }else{
  26. foreach ($invokes as $k=>&$invoke){
  27. $invoke = json_decode($invoke,true);
  28. if(!in_array($invoke['addons_name'],$addons_list)) unset($invokes[$k]);
  29. }
  30. }
  31. if(!empty($invokes)){
  32. $call = GlobalInvoke::INVOKE_MAP[$invoke_id]['method'];
  33. return $this->$call($invokes,$params);
  34. } else {
  35. // throw new \Exception('公共调用实际执行类未找到');
  36. return [];
  37. }
  38. }
  39. /**
  40. * 调用具体注入的类
  41. * @param [type] $class 实际逻辑执行类
  42. * @param [type] $method 执行方法
  43. * @param [type] $params 需要的参数
  44. * @param [type] $init_params 构造函数需要的参数
  45. * @return void
  46. */
  47. public function invoke($class,$method,$params, $init_params = null){
  48. // dd(44444444444, $class, $method, $params);
  49. // dd(class_exists($class), method_exists($class, $method));
  50. if (class_exists($class) == false){
  51. return [];
  52. // throw new Exception('全局调用的类'.$class.'不存在');
  53. }
  54. if (method_exists($class, $method) == false) throw new Exception('全局调用的方法'.$class.'->'.$method.'不存在');
  55. $reflect_method = new ReflectionMethod($class, $method);
  56. if ($reflect_method->isStatic()) {
  57. $res = $class::$method($params);
  58. } else {
  59. $obj = new $class($init_params);
  60. $res = $obj->$method($params);
  61. }
  62. return $res;
  63. }
  64. /**
  65. * 验证每个注入调用的结果是否合规
  66. * @param [type] $return
  67. * @return boolean
  68. */
  69. protected function validateInvokeReturn($invoke_id,$return=null):bool{
  70. $call = GlobalInvoke::INVOKE_MAP[$invoke_id]['validateInvokeMethod'];
  71. return $this->$call($return);
  72. }
  73. }