Exemple #1
0
 public static function createFromToken(FunctionDefine $aFunctionDefine, Aspect $aAspect)
 {
     if (!($aClassDefine = $aFunctionDefine->belongsClass())) {
         throw new Exception("传入的 \$aFunctionDefine 参数无效,必须是一个类方法的定义Token");
     }
     if (!($aDocToken = $aFunctionDefine->docToken())) {
         throw new Exception("传入了无效Advice %s::%s() :没有DocComment申明。", array($aClassDefine->fullName(), $aFunctionDefine->name()));
     }
     $aDocComment = $aDocToken->docComment();
     $sPosition = null;
     if ($aDocComment->hasItem('advice')) {
         $sPosition = $aDocComment->item('advice');
         $sPosition = trim($sPosition);
         $sPosition = strtolower($sPosition);
     }
     if (!$sPosition) {
         $sPosition = self::after;
     }
     $aAdvice = new self($aFunctionDefine->name(), $aFunctionDefine->bodySource(), $sPosition, $aFunctionDefine);
     $aAdvice->aDefineAspect = $aAspect;
     // for pointcut
     foreach ($aDocComment->itemIterator('for') as $sPointcutName) {
         if (!($aPointcut = $aAspect->pointcuts()->getByName($sPointcutName))) {
             throw new Exception("定义Aspect %s 的 Advice %s 时,申明了一个不存在的 Pointcut: %s 。", array($sAspectName, $aAdvice->name(), $sPointcutName));
         }
         $aAdvice->arrForPointcuts[] = $sPointcutName;
     }
     return $aAdvice;
 }
Exemple #2
0
 public function addFunction(FunctionDefine $aFunction)
 {
     if ($aClass = $aFunction->belongsClass()) {
         $sClassName = $aClass->fullName();
     } else {
         $sClassName = '';
     }
     if (!($sFuncName = $aFunction->name())) {
         $sFuncName = '';
     }
     $this->arrMethods[$sClassName][$sFuncName] = $aFunction;
 }
Exemple #3
0
 public static function createFromToken(FunctionDefine $aFunctionDefine)
 {
     if (!($aClassDefine = $aFunctionDefine->belongsClass())) {
         throw new Exception("传入的 \$aFunctionDefine 参数无效,必须是一个类方法的定义Token");
     }
     try {
         $aMethodRef = new \ReflectionMethod($aClassDefine->fullName(), $aFunctionDefine->name());
     } catch (\Exception $e) {
         throw new Exception("无法找到 Pointcut %s::%s 的定义", array($aClassDefine->fullName(), $aFunctionDefine->name()), $e);
     }
     // 检查参数(不能有非可缺省的参数)
     if ($aMethodRef->getNumberOfRequiredParameters()) {
         throw new Exception("Pointcut %s::%s() 的定义无效:要求了非可缺省的参数; 请检查该Pointcut的参数表。", array($aClassDefine->fullName(), $aFunctionDefine->name()));
     }
     // 声明为静态方法
     if ($aMethodRef->isStatic()) {
         if (!$aMethodRef->isPublic()) {
             throw new Exception("Pointcut %s::%s() 声明为 static 类型,static 类型的 Pointcut 必须为 public。", array($aClassDefine->fullName(), $aFunctionDefine->name()));
         }
         $arrJointPoints = call_user_func(array($aClassDefine->fullName(), $aFunctionDefine->name()));
     } else {
         try {
             $aClassRef = new \ReflectionClass($aClassDefine->fullName());
         } catch (\Exception $e) {
             throw new Exception("无法找到 Aspect %s 的定义,无法定义Pointcut:%s::%s", array($aClassDefine->fullName(), $aClassDefine->fullName(), $aFunctionDefine->name()), $e);
         }
         // 检查该类的构造函数的参数
         if ($aConstructor = $aClassRef->getConstructor() and $aConstructor->getNumberOfRequiredParameters()) {
             throw new Exception("由于 Pointcut %s::%s() 没有被申明为 static ,则所属的Aspect(%s)的构造函数不能要求非可省的参数。将 Pointcut %s::%s() 声明为 static,或者取消Aspect(%s)的构造函数所要求的非可省参数。", array($aClassDefine->fullName(), $aFunctionDefine->name(), $aClassDefine->fullName(), $aClassDefine->fullName(), $aFunctionDefine->name(), $aClassDefine->fullName()));
         }
         $aMethodRef->setAccessible(true);
         $arrJointPoints = $aMethodRef->invokeArgs($aClassRef->newInstanceArgs(), array());
     }
     $aPointcut = new self($aFunctionDefine->name());
     $aPointcut->sDefineMethod = $aFunctionDefine->name();
     if (is_array($arrJointPoints)) {
         foreach ($arrJointPoints as $aJointPoint) {
             if ($aJointPoint instanceof JointPoint) {
                 $aPointcut->jointPoints()->add($aJointPoint);
                 $aJointPoint->setPointcut($aPointcut);
             } else {
                 throw new Exception("Pointcut %s::%s 的定义中,申明了无效的 JointPoint: %s", array($aClassDefine->fullName(), $aFunctionDefine->name(), var_export($aJointPoint, true)));
             }
         }
     }
     return $aPointcut;
 }