/vendor/doctrine/lib/Doctrine/ORM/Tools/Export/Driver/AbstractExporter.php

https://github.com/xbojer/gfw · PHP · 215 lines · 109 code · 25 blank · 81 comment · 7 complexity · 479ea62aa16137b8d9e0baab70a6e425 MD5 · raw file

  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. $output = $this->exportClassMetadata($metadata);
  103. $path = $this->_generateOutputPath($metadata);
  104. $dir = dirname($path);
  105. if ( ! is_dir($dir)) {
  106. mkdir($dir, 0777, true);
  107. }
  108. if (file_exists($path) && !$this->_overwriteExistingFiles) {
  109. throw ExportException::attemptOverwriteExistingFile($path);
  110. }
  111. file_put_contents($path, $output);
  112. }
  113. }
  114. /**
  115. * Generate the path to write the class for the given ClassMetadataInfo instance
  116. *
  117. * @param ClassMetadataInfo $metadata
  118. * @return string $path
  119. */
  120. protected function _generateOutputPath(ClassMetadataInfo $metadata)
  121. {
  122. return $this->_outputDir . '/' . str_replace('\\', '.', $metadata->name) . $this->_extension;
  123. }
  124. /**
  125. * Set the directory to output the mapping files to
  126. *
  127. * [php]
  128. * $exporter = new YamlExporter($metadata, __DIR__ . '/yaml');
  129. * $exporter->setExtension('.yml');
  130. * $exporter->export();
  131. *
  132. * @param string $extension
  133. * @return void
  134. */
  135. public function setExtension($extension)
  136. {
  137. $this->_extension = $extension;
  138. }
  139. protected function _getInheritanceTypeString($type)
  140. {
  141. switch ($type)
  142. {
  143. case ClassMetadataInfo::INHERITANCE_TYPE_NONE:
  144. return 'NONE';
  145. break;
  146. case ClassMetadataInfo::INHERITANCE_TYPE_JOINED:
  147. return 'JOINED';
  148. break;
  149. case ClassMetadataInfo::INHERITANCE_TYPE_SINGLE_TABLE:
  150. return 'SINGLE_TABLE';
  151. break;
  152. case ClassMetadataInfo::INHERITANCE_TYPE_TABLE_PER_CLASS:
  153. return 'PER_CLASS';
  154. break;
  155. }
  156. }
  157. protected function _getChangeTrackingPolicyString($policy)
  158. {
  159. switch ($policy)
  160. {
  161. case ClassMetadataInfo::CHANGETRACKING_DEFERRED_IMPLICIT:
  162. return 'DEFERRED_IMPLICIT';
  163. break;
  164. case ClassMetadataInfo::CHANGETRACKING_DEFERRED_EXPLICIT:
  165. return 'DEFERRED_EXPLICIT';
  166. break;
  167. case ClassMetadataInfo::CHANGETRACKING_NOTIFY:
  168. return 'NOTIFY';
  169. break;
  170. }
  171. }
  172. protected function _getIdGeneratorTypeString($type)
  173. {
  174. switch ($type)
  175. {
  176. case ClassMetadataInfo::GENERATOR_TYPE_AUTO:
  177. return 'AUTO';
  178. break;
  179. case ClassMetadataInfo::GENERATOR_TYPE_SEQUENCE:
  180. return 'SEQUENCE';
  181. break;
  182. case ClassMetadataInfo::GENERATOR_TYPE_TABLE:
  183. return 'TABLE';
  184. break;
  185. case ClassMetadataInfo::GENERATOR_TYPE_IDENTITY:
  186. return 'IDENTITY';
  187. break;
  188. }
  189. }
  190. }