Beispiel #1
0
 /**
  * Возвращает код advice секции для auto pointcut
  *
  * @param string $class
  * @param string $method
  * @param string $autoPointcut
  * @return Miaox_Aop_Advice
  */
 public function &getAdviceFromAutoPointcut($class, $method, $autoPointcut)
 {
     $advice = new Miaox_Aop_Advice();
     $a =& $this->_weave->getAdviceFromAutoPointcut($class, $method, $autoPointcut);
     $code = $a->getData();
     // Does it has any code to replace?
     if (strlen($code) > 0) {
         // PHP Code Cruncher
         if ($this->_compact) {
             $code = Miaox_Aop_CodeCruncher::process($code);
         } else {
             $code = "\r\n" . $code . "\r\n";
         }
         // Add an informative text
         $code = "/* AOP \"" . $autoPointcut . "\" Auto Code */ " . $code . " ";
     }
     $advice->addData($code);
     return $advice;
 }
Beispiel #2
0
 /**
  * Возвращает все advice для авто среза, удовлетволяющего условиям
  *
  * @param string $className имя класса -- фильтр для среза
  * @param string $functionName имя функции -- фильтр для среза
  * @param string $autoPointcut значение из набора ( before|after|around ) -- фильтр
  * @return Miaox_Aop_Advice
  */
 public function &getAdviceFromAutoPointcut($className, $functionName, $autoPointcut)
 {
     $advice = new Miaox_Aop_Advice();
     $pointcuts =& $this->getPointcuts();
     $l = count($pointcuts);
     for ($i = 0; $i < $l; $i++) {
         $pointcut =& $pointcuts[$i];
         if ($pointcut instanceof Miaox_Aop_Pointcut_Auto && ($pointcut->hasClassName($className) || $pointcut->hasClassName("")) && ($pointcut->hasFunctionName($functionName) || $pointcut->hasFunctionName(""))) {
             if (!($pointcut->hasNotInClassName($className) || $pointcut->hasNotInFunctionName($functionName))) {
                 if ($pointcut->hasAuto($autoPointcut)) {
                     $a = $pointcut->getAdvice();
                     $advice->addData($a->getData());
                 }
                 if ($pointcut->hasAuto("around")) {
                     $a = $pointcut->getAdvice();
                     //eregi( "(.*)[\t\s \n ]proceed\(\);(.*)", $a->getData(), $data );
                     $data = explode('proceed();', $a->getData());
                     array_unshift($data, $a->getData());
                     if ($autoPointcut == "before") {
                         $data = isset($data[1]) ? $data[1] : $a->getData();
                     } else {
                         if ($autoPointcut == "after") {
                             $data = isset($data[2]) ? $data[2] : $a->getData();
                         }
                     }
                     $advice->addData($data);
                 }
             } else {
                 $this->_checkForAttrMatching($pointcut, $className, $functionName);
             }
         }
     }
     return $advice;
 }
Beispiel #3
0
 /**
  * Возвращает advice, содержащий все методы advice из срезов, загруженных в weave и удовлетворающих условиям
  *
  * @param string $className имя класса
  * @param string имя метода/функции
  * @param string $autoPointcut "after"|"before"|"around"
  * @return Miaox_Aop_Advice результирующий advice
  */
 public function &getAdviceFromAutoPointcut($className, $functionName, $autoPointcut)
 {
     $advice = new Miaox_Aop_Advice();
     $aspects = $this->getAspects();
     $l = count($aspects);
     for ($i = 0; $i < $l; $i++) {
         $aspect =& $this->_aspects[$i];
         $a =& $aspect->getAdviceFromAutoPointcut($className, $functionName, $autoPointcut);
         $advice->addData($a->getData());
     }
     return $advice;
 }