| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- <?php
- namespace common\globals;
- use common\enums\RedisKeyEnum;
- use common\models\common\AddonsInvoker;
- use common\traits\ErrorTrait;
- use Exception;
- use ReflectionMethod;
- abstract class BaseGlobal
- {
- use ErrorTrait;
- /**
- * 发起全局调用
- * @param [type] $invoke_id
- * @param [type] $addons_list
- * @param [type] $params
- * @return void
- */
- public function handle($invoke_id,$addons_list,$params=[]){
- $params['invoke_id'] = $invoke_id;
- $redis = \Yii::$app->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);
- }
- }
|