示例#1
0
 /**
  * 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};
 }
示例#3
0
 /**
  * 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);
     }
 }