/** * Return list of advices for class * * @param string|ReflectionClass|ParsedReflectionClass $class Class to advise * * @return array|Aop\Advice[] List of advices for class */ public function getAdvicesForClass($class) { $this->loader->loadAdvisorsAndPointcuts(); $classAdvices = array(); if (!$class instanceof ReflectionClass && !$class instanceof ParsedReflectionClass) { $class = new ReflectionClass($class); } $parentClass = $class->getParentClass(); if ($parentClass && preg_match('/' . AspectContainer::AOP_PROXIED_SUFFIX . '$/', $parentClass->name)) { $originalClass = $parentClass; } else { $originalClass = $class; } foreach ($this->container->getByTag('advisor') as $advisorId => $advisor) { if ($advisor instanceof Aop\PointcutAdvisor) { $pointcut = $advisor->getPointcut(); if ($pointcut->getClassFilter()->matches($class)) { $classAdvices = array_merge_recursive($classAdvices, $this->getAdvicesFromAdvisor($originalClass, $advisor, $advisorId, $pointcut)); } } if ($advisor instanceof Aop\IntroductionAdvisor) { if ($advisor->getClassFilter()->matches($class)) { $classAdvices = array_merge_recursive($classAdvices, $this->getIntroductionFromAdvisor($originalClass, $advisor, $advisorId)); } } } return $classAdvices; }
/** * Magic accessor * * @param string $name Key name * * @throws \InvalidArgumentException if referenced value is not an advisor * @return Advice */ public function __get($name) { if ($this->container->has($name)) { $advisor = $this->container->get($name); } else { list(, $advisorName) = explode('.', $name); list($aspect) = explode('->', $advisorName); $aspectInstance = $this->container->getAspect($aspect); $this->loader->loadAndRegister($aspectInstance); $advisor = $this->container->get($name); } if (!$advisor instanceof Advisor) { throw new \InvalidArgumentException("Reference {$name} is not an advisor"); } $this->{$name} = $advisor->getAdvice(); return $this->{$name}; }
/** * Constructor for container */ public function __construct() { // Register all services in the container $this->share('aspect.loader', function (Container $container) { $aspectLoader = new AspectLoader($container, $container->get('aspect.annotation.reader')); $lexer = $container->get('aspect.pointcut.lexer'); $parser = $container->get('aspect.pointcut.parser'); // Register general aspect loader extension $aspectLoader->registerLoaderExtension(new GeneralAspectLoaderExtension($lexer, $parser)); $aspectLoader->registerLoaderExtension(new IntroductionAspectExtension($lexer, $parser)); return $aspectLoader; }); $this->share('aspect.cached.loader', function (Container $container) { $cachedAspectLoader = new CachedAspectLoader($container, 'aspect.loader', $container->get('kernel.options')); return $cachedAspectLoader; }); $this->share('aspect.advisor.accessor', function (Container $container) { return new LazyAdvisorAccessor($container, $container->get('aspect.cached.loader')); }); $this->share('aspect.advice_matcher', function (Container $container) { return new AdviceMatcher($container->get('aspect.loader'), $container->get('kernel.interceptFunctions')); }); $this->share('aspect.annotation.reader', function (Container $container) { $options = $container->get('kernel.options'); $reader = new AnnotationReader(); if (!empty($options['cacheDir'])) { $reader = new FileCacheReader($reader, $options['cacheDir'] . DIRECTORY_SEPARATOR . '_annotations' . DIRECTORY_SEPARATOR, $options['debug']); } return $reader; }); $this->share('aspect.annotation.raw.reader', function () { return new RawAnnotationReader(); }); $this->share('aspect.cache.path.manager', function (Container $container) { return new CachePathManager($container->get('kernel')); }); // Pointcut services $this->share('aspect.pointcut.lexer', function () { return new PointcutLexer(); }); $this->share('aspect.pointcut.parser', function (Container $container) { return new PointcutParser(new PointcutGrammar($container, $container->get('aspect.annotation.raw.reader'))); }); }
/** * Utility method to load and register unloaded aspects * * @param array $unloadedAspects List of unloaded aspects */ private function loadAndRegisterAspects(array $unloadedAspects) { foreach ($unloadedAspects as $unloadedAspect) { $this->aspectLoader->loadAndRegister($unloadedAspect); } }