Rajout de doctrine/orm
[zf2.biz/galerie.git] / vendor / doctrine / orm / lib / Doctrine / ORM / Tools / Export / Driver / YamlExporter.php
1 <?php
2 /*
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.
14  *
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>.
18  */
19
20 namespace Doctrine\ORM\Tools\Export\Driver;
21
22 use Doctrine\ORM\Mapping\ClassMetadataInfo;
23
24 /**
25  * ClassMetadata exporter for Doctrine YAML mapping files
26  *
27  * 
28  * @link    www.doctrine-project.org
29  * @since   2.0
30  * @author  Jonathan Wage <jonwage@gmail.com>
31  */
32 class YamlExporter extends AbstractExporter
33 {
34     protected $_extension = '.dcm.yml';
35
36     /**
37      * Converts a single ClassMetadata instance to the exported format
38      * and returns it
39      *
40      * TODO: Should this code be pulled out in to a toArray() method in ClassMetadata
41      *
42      * @param ClassMetadataInfo $metadata
43      * @return mixed $exported
44      */
45     public function exportClassMetadata(ClassMetadataInfo $metadata)
46     {
47         $array = array();
48
49         if ($metadata->isMappedSuperclass) {
50             $array['type'] = 'mappedSuperclass';
51         } else {
52             $array['type'] = 'entity';
53         }
54
55         $array['table'] = $metadata->table['name'];
56
57         if (isset($metadata->table['schema'])) {
58             $array['schema'] = $metadata->table['schema'];
59         }
60
61         $inheritanceType = $metadata->inheritanceType;
62         if ($inheritanceType !== ClassMetadataInfo::INHERITANCE_TYPE_NONE) {
63             $array['inheritanceType'] = $this->_getInheritanceTypeString($inheritanceType);
64         }
65
66         if ($column = $metadata->discriminatorColumn) {
67             $array['discriminatorColumn'] = $column;
68         }
69
70         if ($map = $metadata->discriminatorMap) {
71             $array['discriminatorMap'] = $map;
72         }
73
74         if ($metadata->changeTrackingPolicy !== ClassMetadataInfo::CHANGETRACKING_DEFERRED_IMPLICIT) {
75             $array['changeTrackingPolicy'] = $this->_getChangeTrackingPolicyString($metadata->changeTrackingPolicy);
76         }
77
78         if (isset($metadata->table['indexes'])) {
79             $array['indexes'] = $metadata->table['indexes'];
80         }
81
82         if ($metadata->customRepositoryClassName) {
83             $array['repositoryClass'] = $metadata->customRepositoryClassName;
84         }
85
86         if (isset($metadata->table['uniqueConstraints'])) {
87             $array['uniqueConstraints'] = $metadata->table['uniqueConstraints'];
88         }
89
90         $fieldMappings = $metadata->fieldMappings;
91
92         $ids = array();
93         foreach ($fieldMappings as $name => $fieldMapping) {
94             $fieldMapping['column'] = $fieldMapping['columnName'];
95             unset(
96                 $fieldMapping['columnName'],
97                 $fieldMapping['fieldName']
98             );
99
100             if ($fieldMapping['column'] == $name) {
101                 unset($fieldMapping['column']);
102             }
103
104             if (isset($fieldMapping['id']) && $fieldMapping['id']) {
105                 $ids[$name] = $fieldMapping;
106                 unset($fieldMappings[$name]);
107                 continue;
108             }
109
110             $fieldMappings[$name] = $fieldMapping;
111         }
112
113         if ( ! $metadata->isIdentifierComposite && $idGeneratorType = $this->_getIdGeneratorTypeString($metadata->generatorType)) {
114             $ids[$metadata->getSingleIdentifierFieldName()]['generator']['strategy'] = $idGeneratorType;
115         }
116
117         if ($ids) {
118             $array['fields'] = $ids;
119         }
120
121         if ($fieldMappings) {
122             if ( ! isset($array['fields'])) {
123                 $array['fields'] = array();
124             }
125             $array['fields'] = array_merge($array['fields'], $fieldMappings);
126         }
127
128         foreach ($metadata->associationMappings as $name => $associationMapping) {
129             $cascade = array();
130             if ($associationMapping['isCascadeRemove']) {
131                 $cascade[] = 'remove';
132             }
133             if ($associationMapping['isCascadePersist']) {
134                 $cascade[] = 'persist';
135             }
136             if ($associationMapping['isCascadeRefresh']) {
137                 $cascade[] = 'refresh';
138             }
139             if ($associationMapping['isCascadeMerge']) {
140                 $cascade[] = 'merge';
141             }
142             if ($associationMapping['isCascadeDetach']) {
143                 $cascade[] = 'detach';
144             }
145             if (count($cascade) === 5) {
146                 $cascade = array('all');
147             }
148             $associationMappingArray = array(
149                 'targetEntity' => $associationMapping['targetEntity'],
150                 'cascade'     => $cascade,
151             );
152
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'];
160                     }
161                 }
162                 $oneToOneMappingArray = array(
163                     'mappedBy'      => $associationMapping['mappedBy'],
164                     'inversedBy'    => $associationMapping['inversedBy'],
165                     'joinColumns'   => $newJoinColumns,
166                     'orphanRemoval' => $associationMapping['orphanRemoval'],
167                 );
168
169                 $associationMappingArray = array_merge($associationMappingArray, $oneToOneMappingArray);
170
171                 if ($associationMapping['type'] & ClassMetadataInfo::ONE_TO_ONE) {
172                     $array['oneToOne'][$name] = $associationMappingArray;
173                 } else {
174                     $array['manyToOne'][$name] = $associationMappingArray;
175                 }
176
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
183                 );
184
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
193                 );
194
195                 $associationMappingArray = array_merge($associationMappingArray, $manyToManyMappingArray);
196                 $array['manyToMany'][$name] = $associationMappingArray;
197             }
198         }
199         if (isset($metadata->lifecycleCallbacks)) {
200             $array['lifecycleCallbacks'] = $metadata->lifecycleCallbacks;
201         }
202
203         return \Symfony\Component\Yaml\Yaml::dump(array($metadata->name => $array), 10);
204     }
205 }