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;
25 * ClassMetadata exporter for Doctrine YAML mapping files
28 * @link www.doctrine-project.org
30 * @author Jonathan Wage <jonwage@gmail.com>
32 class YamlExporter extends AbstractExporter
34 protected $_extension = '.dcm.yml';
37 * Converts a single ClassMetadata instance to the exported format
40 * TODO: Should this code be pulled out in to a toArray() method in ClassMetadata
42 * @param ClassMetadataInfo $metadata
43 * @return mixed $exported
45 public function exportClassMetadata(ClassMetadataInfo $metadata)
49 if ($metadata->isMappedSuperclass) {
50 $array['type'] = 'mappedSuperclass';
52 $array['type'] = 'entity';
55 $array['table'] = $metadata->table['name'];
57 if (isset($metadata->table['schema'])) {
58 $array['schema'] = $metadata->table['schema'];
61 $inheritanceType = $metadata->inheritanceType;
62 if ($inheritanceType !== ClassMetadataInfo::INHERITANCE_TYPE_NONE) {
63 $array['inheritanceType'] = $this->_getInheritanceTypeString($inheritanceType);
66 if ($column = $metadata->discriminatorColumn) {
67 $array['discriminatorColumn'] = $column;
70 if ($map = $metadata->discriminatorMap) {
71 $array['discriminatorMap'] = $map;
74 if ($metadata->changeTrackingPolicy !== ClassMetadataInfo::CHANGETRACKING_DEFERRED_IMPLICIT) {
75 $array['changeTrackingPolicy'] = $this->_getChangeTrackingPolicyString($metadata->changeTrackingPolicy);
78 if (isset($metadata->table['indexes'])) {
79 $array['indexes'] = $metadata->table['indexes'];
82 if ($metadata->customRepositoryClassName) {
83 $array['repositoryClass'] = $metadata->customRepositoryClassName;
86 if (isset($metadata->table['uniqueConstraints'])) {
87 $array['uniqueConstraints'] = $metadata->table['uniqueConstraints'];
90 $fieldMappings = $metadata->fieldMappings;
93 foreach ($fieldMappings as $name => $fieldMapping) {
94 $fieldMapping['column'] = $fieldMapping['columnName'];
96 $fieldMapping['columnName'],
97 $fieldMapping['fieldName']
100 if ($fieldMapping['column'] == $name) {
101 unset($fieldMapping['column']);
104 if (isset($fieldMapping['id']) && $fieldMapping['id']) {
105 $ids[$name] = $fieldMapping;
106 unset($fieldMappings[$name]);
110 $fieldMappings[$name] = $fieldMapping;
113 if ( ! $metadata->isIdentifierComposite && $idGeneratorType = $this->_getIdGeneratorTypeString($metadata->generatorType)) {
114 $ids[$metadata->getSingleIdentifierFieldName()]['generator']['strategy'] = $idGeneratorType;
118 $array['fields'] = $ids;
121 if ($fieldMappings) {
122 if ( ! isset($array['fields'])) {
123 $array['fields'] = array();
125 $array['fields'] = array_merge($array['fields'], $fieldMappings);
128 foreach ($metadata->associationMappings as $name => $associationMapping) {
130 if ($associationMapping['isCascadeRemove']) {
131 $cascade[] = 'remove';
133 if ($associationMapping['isCascadePersist']) {
134 $cascade[] = 'persist';
136 if ($associationMapping['isCascadeRefresh']) {
137 $cascade[] = 'refresh';
139 if ($associationMapping['isCascadeMerge']) {
140 $cascade[] = 'merge';
142 if ($associationMapping['isCascadeDetach']) {
143 $cascade[] = 'detach';
145 if (count($cascade) === 5) {
146 $cascade = array('all');
148 $associationMappingArray = array(
149 'targetEntity' => $associationMapping['targetEntity'],
150 'cascade' => $cascade,
153 if ($associationMapping['type'] & ClassMetadataInfo::TO_ONE) {
154 $joinColumns = $associationMapping['joinColumns'];
155 $newJoinColumns = array();
156 foreach ($joinColumns as $joinColumn) {
157 $newJoinColumns[$joinColumn['name']]['referencedColumnName'] = $joinColumn['referencedColumnName'];
158 if (isset($joinColumn['onDelete'])) {
159 $newJoinColumns[$joinColumn['name']]['onDelete'] = $joinColumn['onDelete'];
162 $oneToOneMappingArray = array(
163 'mappedBy' => $associationMapping['mappedBy'],
164 'inversedBy' => $associationMapping['inversedBy'],
165 'joinColumns' => $newJoinColumns,
166 'orphanRemoval' => $associationMapping['orphanRemoval'],
169 $associationMappingArray = array_merge($associationMappingArray, $oneToOneMappingArray);
171 if ($associationMapping['type'] & ClassMetadataInfo::ONE_TO_ONE) {
172 $array['oneToOne'][$name] = $associationMappingArray;
174 $array['manyToOne'][$name] = $associationMappingArray;
177 } else if ($associationMapping['type'] == ClassMetadataInfo::ONE_TO_MANY) {
178 $oneToManyMappingArray = array(
179 'mappedBy' => $associationMapping['mappedBy'],
180 'inversedBy' => $associationMapping['inversedBy'],
181 'orphanRemoval' => $associationMapping['orphanRemoval'],
182 'orderBy' => isset($associationMapping['orderBy']) ? $associationMapping['orderBy'] : null
185 $associationMappingArray = array_merge($associationMappingArray, $oneToManyMappingArray);
186 $array['oneToMany'][$name] = $associationMappingArray;
187 } else if ($associationMapping['type'] == ClassMetadataInfo::MANY_TO_MANY) {
188 $manyToManyMappingArray = array(
189 'mappedBy' => $associationMapping['mappedBy'],
190 'inversedBy' => $associationMapping['inversedBy'],
191 'joinTable' => isset($associationMapping['joinTable']) ? $associationMapping['joinTable'] : null,
192 'orderBy' => isset($associationMapping['orderBy']) ? $associationMapping['orderBy'] : null
195 $associationMappingArray = array_merge($associationMappingArray, $manyToManyMappingArray);
196 $array['manyToMany'][$name] = $associationMappingArray;
199 if (isset($metadata->lifecycleCallbacks)) {
200 $array['lifecycleCallbacks'] = $metadata->lifecycleCallbacks;
203 return \Symfony\Component\Yaml\Yaml::dump(array($metadata->name => $array), 10);