redis; $redis_key = RedisKeyEnum::suffix(RedisKeyEnum::GLOBAL_INVOKE, '',true) .':'. $invoke_id; $invokes = $redis->smembers($redis_key); if(empty($invokes)){ $invokes = AddonsInvoker::getList($invoke_id,$addons_list); }else{ foreach ($invokes as $k=>&$invoke){ $invoke = json_decode($invoke,true); if(!in_array($invoke['addons_name'],$addons_list)) unset($invokes[$k]); } } if(!empty($invokes)){ $call = GlobalInvoke::INVOKE_MAP[$invoke_id]['method']; return $this->$call($invokes,$params); } else { // throw new \Exception('公共调用实际执行类未找到'); return []; } } /** * 调用具体注入的类 * @param [type] $class 实际逻辑执行类 * @param [type] $method 执行方法 * @param [type] $params 需要的参数 * @param [type] $init_params 构造函数需要的参数 * @return void */ public function invoke($class,$method,$params, $init_params = null){ // dd(44444444444, $class, $method, $params); // dd(class_exists($class), method_exists($class, $method)); if (class_exists($class) == false){ return []; // throw new Exception('全局调用的类'.$class.'不存在'); } if (method_exists($class, $method) == false) throw new Exception('全局调用的方法'.$class.'->'.$method.'不存在'); $reflect_method = new ReflectionMethod($class, $method); if ($reflect_method->isStatic()) { $res = $class::$method($params); } else { $obj = new $class($init_params); $res = $obj->$method($params); } return $res; } /** * 验证每个注入调用的结果是否合规 * @param [type] $return * @return boolean */ protected function validateInvokeReturn($invoke_id,$return=null):bool{ $call = GlobalInvoke::INVOKE_MAP[$invoke_id]['validateInvokeMethod']; return $this->$call($return); } }