1 | <?php |
||
27 | final class MappingXmlDriver implements MappingDriverInterface |
||
28 | { |
||
29 | |||
30 | const RDM_SCHEMA_URI = "http://github.com/addiks/symfony_rdm/tree/master/Resources/mapping-schema.v1.xsd"; |
||
31 | const DOCTRINE_SCHEMA_URI = "http://doctrine-project.org/schemas/orm/doctrine-mapping"; |
||
32 | |||
33 | /** |
||
34 | * @var FileLocator |
||
35 | */ |
||
36 | private $fileLocator; |
||
37 | |||
38 | /** |
||
39 | * @var string |
||
40 | */ |
||
41 | private $schemaFilePath; |
||
42 | |||
43 | 2 | public function __construct( |
|
50 | |||
51 | 1 | public function loadRDMMetadataForClass(string $className): ?EntityMappingInterface |
|
101 | |||
102 | 1 | private function readChoice(DOMNode $choiceNode, string $mappingFile, string $defaultColumnName): ChoiceMapping |
|
103 | { |
||
104 | /** @var string|Colum $columnName */ |
||
105 | 1 | $column = $defaultColumnName; |
|
106 | |||
107 | 1 | if (!is_null($choiceNode->attributes->getNamedItem("column"))) { |
|
108 | 1 | $column = (string)$choiceNode->attributes->getNamedItem("column")->nodeValue; |
|
109 | } |
||
110 | |||
111 | /** @var array<MappingInterface> $choiceMappings */ |
||
112 | 1 | $choiceMappings = array(); |
|
113 | |||
114 | 1 | foreach ($choiceNode->childNodes as $optionNode) { |
|
115 | /** @var DOMNode $optionNode */ |
||
116 | |||
117 | 1 | while ($optionNode instanceof DOMNode && in_array($optionNode->nodeType, [ |
|
118 | 1 | XML_TEXT_NODE, |
|
119 | 1 | XML_COMMENT_NODE |
|
120 | ])) { |
||
121 | 1 | $optionNode = $optionNode->nextSibling; |
|
122 | } |
||
123 | |||
124 | 1 | if ($optionNode instanceof DOMNode) { |
|
125 | /** @var mixed $nodeName */ |
||
126 | 1 | $nodeName = $optionNode->namespaceURI . ":" . $optionNode->localName; |
|
127 | |||
128 | 1 | if ($nodeName === self::RDM_SCHEMA_URI . ":option") { |
|
129 | /** @var string $determinator */ |
||
130 | 1 | $determinator = (string)$optionNode->attributes->getNamedItem("name")->nodeValue; |
|
131 | |||
132 | /** @var DOMNode $optionMappingNode */ |
||
133 | 1 | $optionMappingNode = $optionNode->firstChild; |
|
134 | |||
135 | 1 | while (in_array($optionMappingNode->nodeType, [XML_TEXT_NODE, XML_COMMENT_NODE])) { |
|
136 | 1 | $optionMappingNode = $optionMappingNode->nextSibling; |
|
137 | } |
||
138 | |||
139 | 1 | if ($optionMappingNode->nodeName === $optionMappingNode->prefix . ":service") { |
|
140 | 1 | $choiceMappings[$determinator] = $this->readService($optionMappingNode, $mappingFile); |
|
141 | |||
142 | 1 | } elseif ($optionMappingNode->nodeName === $optionMappingNode->prefix . ":choice") { |
|
143 | $choiceMappings[$determinator] = $this->readChoice($optionMappingNode, $mappingFile, sprintf( |
||
144 | "%s_%s", |
||
145 | $defaultColumnName, |
||
146 | 1 | $determinator |
|
147 | )); |
||
148 | } |
||
149 | |||
150 | 1 | } elseif ($nodeName === self::DOCTRINE_SCHEMA_URI . ":field") { |
|
151 | 1 | $column = $this->readDoctrineField($optionNode); |
|
152 | } |
||
153 | } |
||
154 | } |
||
155 | |||
156 | 1 | return new ChoiceMapping($column, $choiceMappings, sprintf( |
|
157 | 1 | "in file '%s'", |
|
158 | 1 | $mappingFile |
|
159 | )); |
||
160 | } |
||
161 | |||
162 | 1 | private function readService(DOMNode $serviceNode, string $mappingFile): ServiceMapping |
|
179 | |||
180 | 1 | private function readDoctrineField(DOMNode $fieldNode): Column |
|
231 | |||
232 | } |
||
233 |
This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.