/** * {@inheritDoc} * @todo Same code exists in AnnotationDriver, should we re-use it somehow or not worry about it? */ public function getAllClassNames() { if ($this->classNames !== null) { return $this->classNames; } if (!$this->paths) { throw MappingException::pathRequired(); } $classes = array(); $includedFiles = array(); foreach ($this->paths as $path) { if (!is_dir($path)) { throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); } $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path), \RecursiveIteratorIterator::LEAVES_ONLY); foreach ($iterator as $file) { if ($file->getBasename('.php') == $file->getBasename()) { continue; } $sourceFile = realpath($file->getPathName()); require_once $sourceFile; $includedFiles[] = $sourceFile; } } $declared = get_declared_classes(); foreach ($declared as $className) { $rc = new \ReflectionClass($className); $sourceFile = $rc->getFileName(); if (in_array($sourceFile, $includedFiles) && !$this->isTransient($className)) { $classes[] = $className; } } $this->classNames = $classes; return $classes; }
/** * {@inheritDoc} */ public function getParentClasses($class) { if (!class_exists($class)) { throw MappingException::nonExistingClass($class); } return class_parents($class); }
/** * Loads the metadata for the specified class into the provided container. * * @param string $className * @param ClassMetadata $metadata * * @throws MappingException */ public function loadMetadataForClass($className, ClassMetadata $metadata) { foreach ($this->drivers as $namespace => $driver) { if (strpos($className, $namespace) === 0) { $driver->loadMetadataForClass($className, $metadata); return; } } throw MappingException::classNotFoundInNamespaces($className, array_keys($this->drivers)); }
/** * Constructor * * @param string $tagClassName * @param boolean $purge whether to delete tags when entity is deleted */ public function __construct($tagClassName, $purge = false) { if (!class_exists($tagClassName)) { throw MappingException::nonExistingClass($tagClassName); } $this->tag = new $tagClassName(); if (!$this->tag instanceof TagInterface) { throw new \InvalidArgumentException(sprintf('Class "%s" must implement TagInterface.', $tagClassName)); } $this->purge = $purge; }
/** * {@inheritDoc} */ public function getAllClassNames($globalBasename) { $classes = array(); if ($this->paths) { foreach ($this->paths as $path) { if (!is_dir($path)) { throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); } $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path), \RecursiveIteratorIterator::LEAVES_ONLY); foreach ($iterator as $file) { $fileName = $file->getBasename($this->fileExtension); if ($fileName == $file->getBasename() || $fileName == $globalBasename) { continue; } // NOTE: All files found here means classes are not transient! $classes[] = str_replace('.', '\\', $fileName); } } } return $classes; }
/** * {@inheritDoc} */ public function findMappingFile($className) { $defaultFileName = str_replace('\\', '.', $className) . $this->fileExtension; foreach ($this->paths as $path) { if (!isset($this->prefixes[$path])) { if (is_file($path . DIRECTORY_SEPARATOR . $defaultFileName)) { return $path . DIRECTORY_SEPARATOR . $defaultFileName; } continue; } $prefix = $this->prefixes[$path]; if (0 !== strpos($className, $prefix . '\\')) { continue; } $filename = $path . '/' . strtr(substr($className, strlen($prefix) + 1), '\\', '.') . $this->fileExtension; if (is_file($filename)) { return $filename; } throw MappingException::mappingFileNotFound($className, $filename); } throw MappingException::mappingFileNotFound($className, substr($className, strrpos($className, '\\') + 1) . $this->fileExtension); }
/** * Loads the metadata for the specified class into the provided container. * * @param string $className * @param ClassMetadata $metadata * * @return void * * @throws MappingException Class not found */ public function loadMetadataForClass($className, ClassMetadata $metadata) { /** * @var $driver FileDriver */ foreach ($this->drivers as $driver) { $namespace = $driver->getGlobalBasename(); if ($this->classNameIsAllowed($className, $namespace)) { $driver->loadMetadataForClass($className, $metadata); return; } } if (null !== $this->getDefaultDriver()) { $this->getDefaultDriver()->loadMetadataForClass($className, $metadata); return; } throw MappingException::classNotFoundInNamespaces($className, array_keys($this->getDrivers())); }
/** * {@inheritDoc} */ public function getAllClassNames() { if ($this->classNames !== null) { return $this->classNames; } if (!$this->paths) { throw MappingException::pathRequired(); } $classes = array(); $includedFiles = array(); foreach ($this->paths as $path) { if (!is_dir($path)) { throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); } $iterator = new \RegexIterator(new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY), '/^.+' . str_replace('.', '\\.', $this->fileExtension) . '$/i', \RecursiveRegexIterator::GET_MATCH); foreach ($iterator as $file) { $sourceFile = realpath($file[0]); require_once $sourceFile; $includedFiles[] = $sourceFile; } } $declared = get_declared_classes(); foreach ($declared as $className) { $rc = new \ReflectionClass($className); $sourceFile = $rc->getFileName(); if (in_array($sourceFile, $includedFiles) && !$this->isTransient($className)) { $classes[] = $className; } } $this->classNames = $classes; return $classes; }
/** * @throws \Doctrine\Common\Persistence\Mapping\MappingException * @return string[] */ public function getAllClassNames() { if ($this->classNames !== NULL) { return $this->classNames; } $classes = array(); foreach ($this->paths as $path) { if (!is_dir($path)) { throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); } foreach ($this->findAllClasses($path) as $class => $sourceFile) { if (!class_exists($class, FALSE) && !interface_exists($class, FALSE) && (PHP_VERSION_ID < 50400 || !trait_exists($class, FALSE))) { $this->loaders[$path]->tryLoad($class); } $classes[] = $class; } } $self = $this; $classes = array_filter($classes, function ($className) use($self) { return !$self->isTransient($className); }); return $this->classNames = $classes; }
/** * Gets the element of schema meta data for the class from the mapping file. * This will lazily load the mapping file if it is not loaded yet. * * @param string $className * * @return array The element of schema meta data. * * @throws MappingException */ public function getElement($className) { if ($this->classCache === null) { $this->initialize(); } if (isset($this->classCache[$className])) { return $this->classCache[$className]; } $result = $this->loadMappingFile($this->locator->findMappingFile($className)); if (!isset($result[$className])) { throw MappingException::invalidMappingFile($className, str_replace('\\', '.', $className) . $this->locator->getFileExtension()); } return $result[$className]; }
/** * {@inheritDoc} */ public function getAllClassNames() { if ($this->classNames !== null) { return $this->classNames; } if (!$this->paths) { throw MappingException::pathRequired(); } $classes = []; $includedFiles = []; foreach ($this->paths as $path) { if (!is_dir($path)) { throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); } $iterator = new \RegexIterator(new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY), '/^.+' . preg_quote($this->fileExtension) . '$/i', \RecursiveRegexIterator::GET_MATCH); foreach ($iterator as $file) { $sourceFile = $file[0]; if (!preg_match('(^phar:)i', $sourceFile)) { $sourceFile = realpath($sourceFile); } foreach ($this->excludePaths as $excludePath) { $exclude = str_replace('\\', '/', realpath($excludePath)); $current = str_replace('\\', '/', $sourceFile); if (strpos($current, $exclude) !== false) { continue 2; } } require_once $sourceFile; $includedFiles[] = $sourceFile; } } $declared = get_declared_classes(); foreach ($declared as $className) { $rc = new \ReflectionClass($className); $sourceFile = $rc->getFileName(); if (in_array($sourceFile, $includedFiles) && !$this->isTransient($className)) { $classes[] = $className; } } $this->classNames = $classes; return $classes; }