Example #1
0
 /**
  * @inheritdoc
  */
 public function fetchAll()
 {
     $classes = $this->scanner->getClasses(true);
     $definitions = [];
     foreach ($classes as $class) {
         /* @var DerivedClassScanner $class */
         $className = $class->getName();
         $matches = [];
         if (preg_match($this->pattern, $className, $matches) && isset($matches[1]) && $class->isInstantiable()) {
             $migration = $this->factory->create($className);
             if ($migration instanceof MigrationInterface) {
                 $definitions[] = new Definition($migration);
             }
         }
     }
     return $definitions;
 }
 /**
  * @inheritdoc
  */
 public function doFetchAll()
 {
     $versions = new Linked();
     $classes = $this->scanner->getClasses(true);
     foreach ($classes as $class) {
         /* @var DerivedClassScanner $class */
         $className = $class->getName();
         $matches = [];
         if (preg_match($this->pattern, $className, $matches) && isset($matches[1]) && $class->isInstantiable()) {
             $migration = $this->getMigrationFactory()->create($className);
             if ($migration instanceof MigrationInterface) {
                 $id = hash('sha1', $className);
                 $version = new LinkedVersion($id, false, $migration);
                 $versions->add($version);
             }
         }
     }
     return $versions;
 }
 /**
  * @return array
  */
 public function collect()
 {
     $classes = array();
     /* @var $classesToScan ClassScanner[] */
     $classesToScan = $this->directoryScanner->getClasses();
     /* @var $classScanner \Zend\Code\Scanner\ClassScanner */
     foreach ($classesToScan as $classScanner) {
         if (!($classArr = $this->collectDataForClass($classScanner, $classesToScan))) {
             continue;
         }
         $classes[$classScanner->getName()] = $classArr;
     }
     return $classes;
 }
Example #4
0
    public function compile()
    {
        $data = array();
        
        $gRules = $this->getIntrospectionRuleset()->getGeneralRules();
        
        /* @var $classScanner Zend\Code\Scanner\DerivedClassScanner */
        foreach ($this->directoryScanner->getClasses(true, true) as $classScanner) {
            
            if ($gRules['excludedClassPatterns']) {
                foreach ($gRules['excludedClassPatterns'] as $ecPattern) {
                    if (preg_match($ecPattern, $classScanner->getName())) {
                        continue 2;
                    }
                }
            }
            
            // determine supertypes
            $superTypes = array();
            if (($parentClasses = $classScanner->getParentClasses()) !== null) {
                $superTypes = array_merge($superTypes, $parentClasses);
            }
            if (($interfaces = $classScanner->getInterfaces())) {
                $superTypes = array_merge($superTypes, $interfaces);
            }
            
            $className = $classScanner->getName();
            $data[$className] = array(
                'superTypes'       => $superTypes,
                'instantiator'     => $this->compileScannerInstantiator($classScanner),
                'injectionMethods' => $this->compileScannerInjectionMethods($classScanner),
            );

        }

        return new ArrayDefinition($data);
    }
Example #5
0
 /**
  * @param ModuleEvent $event
  * @throws Exception
  */
 public function onMergeConfig(ModuleEvent $event)
 {
     // do not parse annotations if config cache is enabled.
     $config = $event->getConfigListener()->getMergedConfig(false);
     $parser = ClassParserFactory::factory($config, $event->getTarget()->getEventManager());
     $modules = $event->getTarget()->getLoadedModules();
     $modulesAllowedToScan = $config['zf_annotation']['scan_modules'];
     foreach ($modules as $module) {
         $parts = explode('\\', get_class($module));
         $modName = array_shift($parts);
         if (!empty($modulesAllowedToScan) && !in_array($modName, $modulesAllowedToScan)) {
             continue;
         }
         $ref = new ReflectionClass($module);
         $dir = dirname($ref->getFileName());
         $classes = new DirectoryScanner($dir);
         $parsedConfig = $parser->parse($classes->getClasses());
     }
     $event->getConfigListener()->setMergedConfig(array_replace_recursive($parsedConfig, $config));
 }
Example #6
0
 /**
  * @param DirectoryScanner $dirScanner
  * @return array
  */
 private function findClasses(DirectoryScanner $dirScanner) : array
 {
     $classes = $dirScanner->getClasses();
     $foundClasses = array();
     foreach ($classes as $class) {
         if ($class->isTrait() === true) {
             $methods = $class->getMethods();
             $parameters = array();
             foreach ($methods as $method) {
                 $parameters = array_merge($parameters, $method->getParameters(true));
             }
         } else {
             $constructor = $class->getMethod("__construct");
             if (!$constructor) {
                 continue;
             }
             $parameters = $constructor->getParameters(true);
         }
         $foundClasses = array_merge($foundClasses, $this->findClassesFromParams($parameters));
     }
     return array_unique($foundClasses);
 }
Example #7
0
 /**
  * Generates a list of Action objects based on the given directory structure, handling
  * each found class as an invokable service
  *
  * @deprecated this logic is deprecated and uses per-directory scanning. Instead, please
  *             map your defined service names in the 'services' config
  * @param  array                    $modules
  * @return array
  * @throws InvalidArgumentException
  */
 protected function buildDirectoryApi(array $modules)
 {
     $api = array();
     foreach ($modules as $moduleName => $module) {
         if (!isset($module['directory']) || !is_dir($module['directory'])) {
             throw new InvalidArgumentException('Invalid directory given: "' . $module['directory'] . '"');
         }
         if (!isset($module['namespace']) || !is_string($module['namespace'])) {
             throw new InvalidArgumentException('Invalid namespace provided for module "' . $moduleName . '"');
         }
         $jsNamespace = rtrim(str_replace('\\', '.', $module['namespace']), '.') . '.';
         $directoryScanner = new DirectoryScanner($module['directory']);
         /* @var $class \Zend\Code\Scanner\DerivedClassScanner */
         foreach ($directoryScanner->getClasses(true) as $class) {
             // now building the service name as exposed client-side
             $className = $class->getName();
             $jsClassName = str_replace('\\', '.', substr($className, strlen($module['namespace']) + 1));
             $jsClassNames = explode('.', $jsClassName);
             $chunks = count($jsClassNames);
             // lcfirst all chunks except the last one
             for ($i = 1; $i < $chunks; $i += 1) {
                 $jsClassNames[$i - 1] = lcfirst($jsClassNames[$i - 1]);
             }
             $serviceName = $jsNamespace . implode('.', $jsClassNames);
             if (!$this->serviceManager->has($serviceName)) {
                 $this->serviceManager->setInvokableClass($serviceName, $className);
             }
             // invoking to check if nothing went wrong - this avoids setting invalid services
             $service = $this->serviceManager->get($serviceName);
             $action = $this->buildAction(get_class($service));
             $action->setName($serviceName);
             $action->setObjectName($className);
             $api[$serviceName] = $action;
         }
     }
     return $api;
 }
Example #8
0
 /**
  * 检索指定目录下的全部资源到数据库中
  */
 private function addResource()
 {
     $this->_resource->remove(array());
     $scaner = new DirectoryScanner();
     $scaner->addDirectory(ROOT_PATH . '/module/Application/src/Application/Controller/');
     $scaner->addDirectory(ROOT_PATH . '/module/Idatabase/src/Idatabase/Controller/');
     foreach ($scaner->getClasses(true) as $classScanner) {
         $className = $classScanner->getName();
         foreach ($classScanner->getMethods(true) as $method) {
             if ($this->endsWith($method->getName(), 'Action')) {
                 $actionName = $method->getName();
                 $docComment = $method->getDocComment();
                 $docBlockScanner = new DocBlockScanner($docComment);
                 $docAtName = $this->getDocNameValue($docBlockScanner->getTags());
                 // 写入数据库
                 $classInfo = $this->parseClassName($className);
                 $this->_resource->insert(array('name' => $docAtName, 'alias' => $className . '\\' . $actionName, 'namespace' => $classInfo['namespace'], 'controller' => $classInfo['controller'], 'action' => $this->parseMethodName($actionName)));
             }
         }
     }
 }