Example #1
0
 /**
  * {@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;
 }
Example #10
0
 /**
  * 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;
 }