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); }); } }
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); }); } }
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()); } } } } } }
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; } }
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; }
} // 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();
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')); } } }
function __construct() { $this->exceptionHandler = array($this, 'exceptionHandler'); set_exception_handler($this->exceptionHandler); aop_add_before('set_exception_handler()', array($this, 'set_exception_handler_pre')); }