AbstractExporter.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. <?php
  2. /*
  3. * $Id$
  4. *
  5. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  6. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  7. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  8. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  9. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  10. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  11. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  12. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  13. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  14. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  15. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  16. *
  17. * This software consists of voluntary contributions made by many individuals
  18. * and is licensed under the LGPL. For more information, see
  19. * <http://www.doctrine-project.org>.
  20. */
  21. namespace Doctrine\ORM\Tools\Export\Driver;
  22. use Doctrine\ORM\Mapping\ClassMetadataInfo;
  23. use Doctrine\ORM\Tools\Export\ExportException;
  24. /**
  25. * Abstract base class which is to be used for the Exporter drivers
  26. * which can be found in \Doctrine\ORM\Tools\Export\Driver
  27. *
  28. * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
  29. * @link www.doctrine-project.org
  30. * @since 2.0
  31. * @version $Revision$
  32. * @author Jonathan Wage <jonwage@gmail.com>
  33. */
  34. abstract class AbstractExporter
  35. {
  36. protected $_metadata = array();
  37. protected $_outputDir;
  38. protected $_extension;
  39. protected $_overwriteExistingFiles = false;
  40. public function __construct($dir = null)
  41. {
  42. $this->_outputDir = $dir;
  43. }
  44. public function setOverwriteExistingFiles($overwrite)
  45. {
  46. $this->_overwriteExistingFiles = $overwrite;
  47. }
  48. /**
  49. * Converts a single ClassMetadata instance to the exported format
  50. * and returns it
  51. *
  52. * @param ClassMetadataInfo $metadata
  53. * @return mixed $exported
  54. */
  55. abstract public function exportClassMetadata(ClassMetadataInfo $metadata);
  56. /**
  57. * Set the array of ClassMetadataInfo instances to export
  58. *
  59. * @param array $metadata
  60. * @return void
  61. */
  62. public function setMetadata(array $metadata)
  63. {
  64. $this->_metadata = $metadata;
  65. }
  66. /**
  67. * Get the extension used to generated the path to a class
  68. *
  69. * @return string $extension
  70. */
  71. public function getExtension()
  72. {
  73. return $this->_extension;
  74. }
  75. /**
  76. * Set the directory to output the mapping files to
  77. *
  78. * [php]
  79. * $exporter = new YamlExporter($metadata);
  80. * $exporter->setOutputDir(__DIR__ . '/yaml');
  81. * $exporter->export();
  82. *
  83. * @param string $dir
  84. * @return void
  85. */
  86. public function setOutputDir($dir)
  87. {
  88. $this->_outputDir = $dir;
  89. }
  90. /**
  91. * Export each ClassMetadata instance to a single Doctrine Mapping file
  92. * named after the entity
  93. *
  94. * @return void
  95. */
  96. public function export()
  97. {
  98. if ( ! is_dir($this->_outputDir)) {
  99. mkdir($this->_outputDir, 0777, true);
  100. }
  101. foreach ($this->_metadata as $metadata) {
  102. //In case output is returned, write it to a file, skip otherwise
  103. if($output = $this->exportClassMetadata($metadata)){
  104. $path = $this->_generateOutputPath($metadata);
  105. $dir = dirname($path);
  106. if ( ! is_dir($dir)) {
  107. mkdir($dir, 0777, true);
  108. }
  109. if (file_exists($path) && !$this->_overwriteExistingFiles) {
  110. throw ExportException::attemptOverwriteExistingFile($path);
  111. }
  112. file_put_contents($path, $output);
  113. }
  114. }
  115. }
  116. /**
  117. * Generate the path to write the class for the given ClassMetadataInfo instance
  118. *
  119. * @param ClassMetadataInfo $metadata
  120. * @return string $path
  121. */
  122. protected function _generateOutputPath(ClassMetadataInfo $metadata)
  123. {
  124. return $this->_outputDir . '/' . str_replace('\\', '.', $metadata->name) . $this->_extension;
  125. }
  126. /**
  127. * Set the directory to output the mapping files to
  128. *
  129. * [php]
  130. * $exporter = new YamlExporter($metadata, __DIR__ . '/yaml');
  131. * $exporter->setExtension('.yml');
  132. * $exporter->export();
  133. *
  134. * @param string $extension
  135. * @return void
  136. */
  137. public function setExtension($extension)
  138. {
  139. $this->_extension = $extension;
  140. }
  141. protected function _getInheritanceTypeString($type)
  142. {
  143. switch ($type)
  144. {
  145. case ClassMetadataInfo::INHERITANCE_TYPE_NONE:
  146. return 'NONE';
  147. break;
  148. case ClassMetadataInfo::INHERITANCE_TYPE_JOINED:
  149. return 'JOINED';
  150. break;
  151. case ClassMetadataInfo::INHERITANCE_TYPE_SINGLE_TABLE:
  152. return 'SINGLE_TABLE';
  153. break;
  154. case ClassMetadataInfo::INHERITANCE_TYPE_TABLE_PER_CLASS:
  155. return 'PER_CLASS';
  156. break;
  157. }
  158. }
  159. protected function _getChangeTrackingPolicyString($policy)
  160. {
  161. switch ($policy)
  162. {
  163. case ClassMetadataInfo::CHANGETRACKING_DEFERRED_IMPLICIT:
  164. return 'DEFERRED_IMPLICIT';
  165. break;
  166. case ClassMetadataInfo::CHANGETRACKING_DEFERRED_EXPLICIT:
  167. return 'DEFERRED_EXPLICIT';
  168. break;
  169. case ClassMetadataInfo::CHANGETRACKING_NOTIFY:
  170. return 'NOTIFY';
  171. break;
  172. }
  173. }
  174. protected function _getIdGeneratorTypeString($type)
  175. {
  176. switch ($type)
  177. {
  178. case ClassMetadataInfo::GENERATOR_TYPE_AUTO:
  179. return 'AUTO';
  180. break;
  181. case ClassMetadataInfo::GENERATOR_TYPE_SEQUENCE:
  182. return 'SEQUENCE';
  183. break;
  184. case ClassMetadataInfo::GENERATOR_TYPE_TABLE:
  185. return 'TABLE';
  186. break;
  187. case ClassMetadataInfo::GENERATOR_TYPE_IDENTITY:
  188. return 'IDENTITY';
  189. break;
  190. }
  191. }
  192. }