Beispiel #1
0
 public static function start()
 {
     $em = MyEntityManagerFactory::getEntityManager();
     /* @var $jp \My\Illusion\AopJoinpoint */
     $before = function ($jp) use($em) {
         TransactionManager::$_stateData[++TransactionManager::$_stateIndex] = 1;
         $em->flush();
         $em->beginTransaction();
     };
     $after = function ($jp) use($em) {
         if ($jp->getException() !== null) {
             TransactionManager::$_stateData[TransactionManager::$_stateIndex] = 2;
             $em->rollback();
         } else {
             if (TransactionManager::$_stateData[TransactionManager::$_stateIndex] === 1) {
                 $em->flush();
                 $em->commit();
             } else {
                 if (TransactionManager::$_stateData[TransactionManager::$_stateIndex] == 0) {
                     $em->rollback();
                 }
             }
             TransactionManager::$_stateIndex--;
         }
     };
     $namespace = '*Controller->*Action()';
     aop_add_before($namespace, $before);
     aop_add_after($namespace, $after);
     $namespace = 'public Models\\Services\\*Service->*()';
     aop_add_before($namespace, $before);
     aop_add_after($namespace, $after);
     $namespace = 'public Models\\Repositories\\*Repository->sav*()';
     aop_add_before($namespace, $before);
     aop_add_after($namespace, $after);
 }
 public function enable()
 {
     foreach ($this->functionalitys as $functionality) {
         aop_add_before($this->match, function (AopJoinPoint $joinPoint) use($functionality) {
             $functionality->before($joinPoint);
         });
     }
 }
Beispiel #3
0
 public function start()
 {
     $dataRepo = $this->dataRepository;
     foreach ($this->functionSignatures as $signature) {
         aop_add_before($signature, function (\AopJoinPoint $ajp) use($dataRepo) {
             $dataRepo->saveParams(1, $ajp->getPointcut(), $ajp->getArguments(), DataFlowDirection::CALLING);
         });
         aop_add_after($signature, function (\AopJoinPoint $ajp) use($dataRepo) {
             $dataRepo->saveParams(1, $ajp->getPointcut(), $ajp->getReturnedValue(), DataFlowDirection::RETURNING);
         });
     }
 }
Beispiel #4
0
 public function registerAspects(MvcEvent $event)
 {
     $application = $event->getApplication();
     $config = $application->getConfig();
     Annotations\AnnotationRegistry::registerAutoloadNamespace(__NAMESPACE__ . '\\Annotation');
     foreach ($config['aop']['aspect_class_paths'] as $path) {
         foreach (new ClassFileLocator($path) as $classInfoFile) {
             foreach ($classInfoFile->getClasses() as $class) {
                 $aspect = new $class();
                 $reader = new Annotations\AnnotationReader();
                 $reflection = new \ReflectionClass($aspect);
                 foreach ($reflection->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
                     $annotation = $reader->getMethodAnnotation($method, 'AOP\\Annotation\\Pointcut');
                     if (!$annotation) {
                         continue;
                     }
                     $advice = $method->getName();
                     $pointcuts = $annotation->rule;
                     foreach ($pointcuts as $pointcut) {
                         list($trigger, $rule) = sscanf($pointcut, "%s %s");
                         switch ($trigger) {
                             case 'before':
                                 aop_add_before($rule, array($aspect, $advice));
                                 break;
                             case 'after':
                                 aop_add_after($rule, array($aspect, $advice));
                                 break;
                             case 'around':
                                 aop_add_around($rule, array($aspect, $advice));
                                 break;
                         }
                     }
                     if ($aspect instanceof \Zend\ServiceManager\ServiceLocatorAwareInterface) {
                         $aspect->setServiceLocator($application->getServiceManager());
                     }
                 }
             }
         }
     }
 }
Beispiel #5
0
 private static final function autowired()
 {
     /* @var $jp \My\Illusion\AopJoinpoint */
     if (self::$autowiredFlag) {
         $em = MyEntityManagerFactory::getEntityManager();
         $before = function ($jp) use($em) {
             // 				\Zend_Debug::dump($jp->getClassName());
             $reflection = new \ReflectionClass($jp->getClassName());
             $params = $reflection->getConstructor()->getParameters();
             $args = $jp->getArguments();
             foreach ($params as $key => $param) {
                 if ($param->getClass()) {
                     $entityName = '\\' . str_replace(array('Repositories', 'Repository'), array('Entities', ''), $param->getClass()->name);
                     $args[$key] = $em->getRepository($entityName);
                 }
             }
             // 				\Zend_Debug::dump($args);
             $jp->setArguments($args);
         };
         $namespace = 'Models\\Services\\*Service->__construct*()';
         aop_add_before($namespace, $before);
         self::$autowiredFlag = false;
     }
 }
Beispiel #6
0
class ErrorHandler
{
    static $callbacks = array();
    static function _errorHandler($errno, $errstr, $errfile, $errline)
    {
        var_dump('errorHandler:');
        foreach (self::$callbacks as $callback) {
            call_user_func($callback, $errno, $errstr, $errfile, $errline);
        }
    }
}
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    var_dump('myErrorHandler:' . $errstr . "\n");
}
$error_handler = 'ErrorHandler::_errorHandler';
// first set
set_error_handler($error_handler);
// make set_error_handler useless
aop_add_before('set_error_handler()', function ($jp) {
    $args = $jp->getArguments();
    ErrorHandler::$callbacks[] = $args[0];
    $jp->setArguments(array($GLOBALS['error_handler']));
});
// other user set
set_error_handler('myErrorHandler');
// trigger error
mysql_connect();
trigger_error("log(x) for x <= 0 is undefined, you used: scale = {$scale}", E_USER_ERROR);
trigger_error("Incorrect input vector, array of values expected", E_USER_WARNING);
trigger_error("Value at position {$pos} is not a number, using 0 (zero)", E_USER_NOTICE);
 /**
  * @inheritdoc
  * @see \Aop\Weaver\WeaverInterface::addBefore()
  */
 public function addBefore(Pointcutinterface $pointcut, AdviceInterface $advice, array $options = [])
 {
     aop_add_before($pointcut->getSelector(), $this->createBinder($pointcut, $advice, $options));
     return $this->lastIndex;
 }
Beispiel #8
0
}
// 3. throw without catch
class DivideByZeroException extends Exception
{
}
//Throw new DivideByZeroException("DivideByZeroException1");
// 4. throw with exception handler
// can NOT hook a exception_handler
class ExceptionHandler
{
    static $callback = array();
    static function _exceptionHandler($e)
    {
        var_dump('ExceptionHandler');
        call_user_func(self::$callback, $e);
    }
}
function exception_handler($exception)
{
    var_dump('exception_handler', $exception->getTraceAsString(), 'exception_handler_end');
}
set_exception_handler('ExceptionHandler::_exceptionHandler');
aop_add_before('set_exception_handler()', function ($jp) {
    $args = $jp->getArguments();
    ExceptionHandler::$callback = $args[0];
    $jp->setArguments(array('ExceptionHandler::_exceptionHandler'));
});
set_exception_handler('exception_handler');
//Throw new DivideByZeroException("DivideByZeroException3");
$redis->connect('192.168.1.1', 6379, 1);
$redis->ping();
Beispiel #9
0
 function hook()
 {
     if ($this->hooks) {
         foreach ($this->hooks as $func) {
             $function = $this->getHookFunc($func);
             aop_add_before($function, array($this, '_preCallback'));
             aop_add_after($function, array($this, '_postCallback'));
         }
     }
 }
Beispiel #10
0
 function __construct()
 {
     $this->exceptionHandler = array($this, 'exceptionHandler');
     set_exception_handler($this->exceptionHandler);
     aop_add_before('set_exception_handler()', array($this, 'set_exception_handler_pre'));
 }