3 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
15 * This software consists of voluntary contributions made by many individuals
16 * and is licensed under the MIT license. For more information, see
17 * <http://www.doctrine-project.org>.
20 namespace Doctrine\ORM\Tools\Export\Driver;
22 use Doctrine\ORM\Mapping\ClassMetadataInfo;
23 use Doctrine\ORM\Tools\Export\ExportException;
26 * Abstract base class which is to be used for the Exporter drivers
27 * which can be found in \Doctrine\ORM\Tools\Export\Driver
30 * @link www.doctrine-project.org
32 * @author Jonathan Wage <jonwage@gmail.com>
34 abstract class AbstractExporter
36 protected $_metadata = array();
37 protected $_outputDir;
38 protected $_extension;
39 protected $_overwriteExistingFiles = false;
41 public function __construct($dir = null)
43 $this->_outputDir = $dir;
46 public function setOverwriteExistingFiles($overwrite)
48 $this->_overwriteExistingFiles = $overwrite;
52 * Converts a single ClassMetadata instance to the exported format
55 * @param ClassMetadataInfo $metadata
56 * @return mixed $exported
58 abstract public function exportClassMetadata(ClassMetadataInfo $metadata);
61 * Set the array of ClassMetadataInfo instances to export
63 * @param array $metadata
66 public function setMetadata(array $metadata)
68 $this->_metadata = $metadata;
72 * Get the extension used to generated the path to a class
74 * @return string $extension
76 public function getExtension()
78 return $this->_extension;
82 * Set the directory to output the mapping files to
85 * $exporter = new YamlExporter($metadata);
86 * $exporter->setOutputDir(__DIR__ . '/yaml');
87 * $exporter->export();
92 public function setOutputDir($dir)
94 $this->_outputDir = $dir;
98 * Export each ClassMetadata instance to a single Doctrine Mapping file
99 * named after the entity
103 public function export()
105 if ( ! is_dir($this->_outputDir)) {
106 mkdir($this->_outputDir, 0777, true);
109 foreach ($this->_metadata as $metadata) {
110 //In case output is returned, write it to a file, skip otherwise
111 if($output = $this->exportClassMetadata($metadata)){
112 $path = $this->_generateOutputPath($metadata);
113 $dir = dirname($path);
114 if ( ! is_dir($dir)) {
115 mkdir($dir, 0777, true);
117 if (file_exists($path) && !$this->_overwriteExistingFiles) {
118 throw ExportException::attemptOverwriteExistingFile($path);
120 file_put_contents($path, $output);
126 * Generate the path to write the class for the given ClassMetadataInfo instance
128 * @param ClassMetadataInfo $metadata
129 * @return string $path
131 protected function _generateOutputPath(ClassMetadataInfo $metadata)
133 return $this->_outputDir . '/' . str_replace('\\', '.', $metadata->name) . $this->_extension;
137 * Set the directory to output the mapping files to
140 * $exporter = new YamlExporter($metadata, __DIR__ . '/yaml');
141 * $exporter->setExtension('.yml');
142 * $exporter->export();
144 * @param string $extension
147 public function setExtension($extension)
149 $this->_extension = $extension;
152 protected function _getInheritanceTypeString($type)
156 case ClassMetadataInfo::INHERITANCE_TYPE_NONE:
160 case ClassMetadataInfo::INHERITANCE_TYPE_JOINED:
164 case ClassMetadataInfo::INHERITANCE_TYPE_SINGLE_TABLE:
165 return 'SINGLE_TABLE';
168 case ClassMetadataInfo::INHERITANCE_TYPE_TABLE_PER_CLASS:
174 protected function _getChangeTrackingPolicyString($policy)
178 case ClassMetadataInfo::CHANGETRACKING_DEFERRED_IMPLICIT:
179 return 'DEFERRED_IMPLICIT';
182 case ClassMetadataInfo::CHANGETRACKING_DEFERRED_EXPLICIT:
183 return 'DEFERRED_EXPLICIT';
186 case ClassMetadataInfo::CHANGETRACKING_NOTIFY:
192 protected function _getIdGeneratorTypeString($type)
196 case ClassMetadataInfo::GENERATOR_TYPE_AUTO:
200 case ClassMetadataInfo::GENERATOR_TYPE_SEQUENCE:
204 case ClassMetadataInfo::GENERATOR_TYPE_TABLE:
208 case ClassMetadataInfo::GENERATOR_TYPE_IDENTITY: