/** * @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; }
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); }
/** * @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)); }
/** * @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); }
/** * 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; }
/** * 检索指定目录下的全部资源到数据库中 */ 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))); } } } }