. */ namespace Doctrine\ORM\Mapping\Driver; use Doctrine\Common\Persistence\Mapping\ClassMetadata, Doctrine\Common\Persistence\Mapping\Driver\MappingDriver, Doctrine\ORM\Mapping\MappingException; /** * The StaticPHPDriver calls a static loadMetadata() method on your entity * classes where you can manually populate the ClassMetadata instance. * * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link www.doctrine-project.org * @since 2.0 * @author Benjamin Eberlei * @author Guilherme Blanco * @author Jonathan H. Wage * @author Roman Borschel */ class StaticPHPDriver implements MappingDriver { /** * Paths of entity directories. * * @var array */ private $_paths = array(); /** * Map of all class names. * * @var array */ private $_classNames; /** * The file extension of mapping documents. * * @var string */ private $_fileExtension = '.php'; public function __construct($paths) { $this->addPaths((array) $paths); } public function addPaths(array $paths) { $this->_paths = array_unique(array_merge($this->_paths, $paths)); } /** * {@inheritdoc} */ public function loadMetadataForClass($className, ClassMetadata $metadata) { call_user_func_array(array($className, 'loadMetadata'), array($metadata)); } /** * {@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($this->_fileExtension) == $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 isTransient($className) { return method_exists($className, 'loadMetadata') ? false : true; } }