. */ namespace Doctrine\ORM\Tools\Export; use Doctrine\ORM\EntityManager; use Doctrine\ORM\Mapping\Classmetadata; /** * Class used for converting your mapping information between the * supported formats: yaml, xml, and php/annotation. * * [php] * // Unify all your mapping information which is written in php, xml, yml * // and convert it to a single set of yaml files. * * $cme = new Doctrine\ORM\Tools\Export\ClassmetadataExporter(); * $cme->addMappingDir(__DIR__ . '/Entities', 'php'); * $cme->addMappingDir(__DIR__ . '/xml', 'xml'); * $cme->addMappingDir(__DIR__ . '/yaml', 'yaml'); * * $exporter = $cme->getExporter('yaml'); * $exporter->setOutputDir(__DIR__ . '/new_yaml'); * $exporter->export(); * * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link www.doctrine-project.org * @since 2.0 * @version $Revision$ * @author Jonathan Wage */ class ClassmetadataExporter { private $_exporterDrivers = array( 'xml' => 'Doctrine\ORM\Tools\Export\Driver\XmlExporter', 'yaml' => 'Doctrine\ORM\Tools\Export\Driver\YamlExporter', 'php' => 'Doctrine\ORM\Tools\Export\Driver\PhpExporter' ); private $_mappingDrivers = array( 'php' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver', 'yaml' => 'Doctrine\ORM\Mapping\Driver\YamlDriver', 'xml' => 'Doctrine\ORM\Mapping\Driver\XmlDriver' ); private $_mappingDriverInstances = array(); public function addMappingDir($dir, $type) { if ( ! isset($this->_mappingDrivers[$type])) { throw DoctrineException::invalidMappingDriverType($type); } $class = $this->_mappingDrivers[$type]; if (is_subclass_of($class, 'Doctrine\ORM\Mapping\Driver\AbstractFileDriver')) { $driver = new $class($dir, constant($class . '::PRELOAD')); } else { $reader = new \Doctrine\Common\Annotations\AnnotationReader(new \Doctrine\Common\Cache\ArrayCache); $reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\'); $driver = new $class($reader); } $this->_mappingDriverInstances[] = array($dir, $driver); } private function _getMetadataInstances() { $classes = array(); foreach ($this->_mappingDriverInstances as $d) { list($dir, $driver) = $d; // TODO: This code exists in the SchemaToolTask.php // Should we pull it out somewhere common? I can see the need to have // a way to retrieve an array of entity names found in some directories if ($driver instanceof \Doctrine\ORM\Mapping\Driver\AnnotationDriver) { $iter = new \FilesystemIterator($dir); $declared = get_declared_classes(); foreach ($iter as $item) { $baseName = $item->getBaseName(); if ($baseName[0] == '.') { continue; } require_once $item->getPathName(); } $declared = array_diff(get_declared_classes(), $declared); foreach ($declared as $className) { if ( ! $driver->isTransient($className)) { $metadata = new ClassMetadata($className); $driver->loadMetadataForClass($className, $metadata); $classes[] = $metadata; } } } else { $preloadedClasses = $driver->preload(true); foreach ($preloadedClasses as $className) { $metadata = new ClassMetadata($className); $driver->loadMetadataForClass($className, $metadata); $classes[] = $metadata; } } } return $classes; } public function getExporter($type, $dir = null) { if ( ! isset($this->_exporterDrivers[$type])) { throw DoctrineException::invalidExporterDriverType($type); } $class = $this->_exporterDrivers[$type]; return new $class($this->_getMetadataInstances()); } }