/** * 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; }
/** * Returns list of unloaded aspects in the container * * @return array|Aspect[] */ public function getUnloadedAspects() { $unloadedAspects = []; foreach ($this->container->getByTag('aspect') as $aspect) { if (!isset($this->loadedAspects[get_class($aspect)])) { $unloadedAspects[] = $aspect; } } return $unloadedAspects; }
/** * Load pointcuts into container * * There is no need to always load pointcuts, so we delay loading */ public function loadAdvisorsAndPointcuts() { $containerResources = $this->container->getResources(); $resourcesToLoad = array_diff($containerResources, $this->loadedResources); if (!$resourcesToLoad) { return; } foreach ($this->container->getByTag('aspect') as $aspect) { $ref = new ReflectionClass($aspect); if (in_array($ref->getFileName(), $resourcesToLoad)) { $this->load($aspect); } } $this->loadedResources = $containerResources; }
/** * Collects list of advisors from the container * * @param AspectContainer $aspectContainer Container instance * * @return Advisor[] List of advisors in the container */ private function loadAdvisorsList(AspectContainer $aspectContainer) { /** @var AspectLoader $aspectLoader */ $aspectLoader = $aspectContainer->get('aspect.cached.loader'); $aspects = $aspectLoader->getUnloadedAspects(); foreach ($aspects as $aspect) { $aspectLoader->loadAndRegister($aspect); } $advisors = $aspectContainer->getByTag('advisor'); return $advisors; }