public function testParse() { $document = new \DOMDocument(); $document->load(__DIR__ . '/_files/argument_parser.xml'); $parser = new ArgumentParser(); $actual = $parser->parse($document->getElementsByTagName('argument')->item(0)); $expected = ['item' => ['one' => ['name' => 'one', 'value' => 'value1'], 'nested' => ['name' => 'nested', 'item' => ['two' => ['name' => 'two', 'value' => 'value2'], 'three' => ['name' => 'three', 'value' => 'value3']]]]]; $this->assertSame($expected, $actual); }
/** * Convert configuration in DOM format to assoc array that can be used by object manager * * @param \DOMDocument $config * @return array * @throws \Exception * @todo this method has high cyclomatic complexity in order to avoid performance issues * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function convert($config) { $output = array(); /** @var \DOMNode $node */ foreach ($config->documentElement->childNodes as $node) { if ($node->nodeType != XML_ELEMENT_NODE) { continue; } switch ($node->nodeName) { case 'preference': $output['preferences'][$node->attributes->getNamedItem('for')->nodeValue] = $node->attributes->getNamedItem('type')->nodeValue; break; case 'type': case 'virtualType': $typeData = array(); $typeNodeAttributes = $node->attributes; $typeNodeShared = $typeNodeAttributes->getNamedItem('shared'); if ($typeNodeShared) { $typeData['shared'] = $this->booleanUtils->toBoolean($typeNodeShared->nodeValue); } if ($node->nodeName == 'virtualType') { $attributeType = $typeNodeAttributes->getNamedItem('type'); // attribute type is required for virtual type only in merged configuration if ($attributeType) { $typeData['type'] = $attributeType->nodeValue; } } $typeArguments = array(); $typePlugins = array(); /** @var \DOMNode $typeChildNode */ foreach ($node->childNodes as $typeChildNode) { if ($typeChildNode->nodeType != XML_ELEMENT_NODE) { continue; } switch ($typeChildNode->nodeName) { case 'arguments': /** @var \DOMNode $argumentNode */ foreach ($typeChildNode->childNodes as $argumentNode) { if ($argumentNode->nodeType != XML_ELEMENT_NODE) { continue; } $argumentName = $argumentNode->attributes->getNamedItem('name')->nodeValue; $argumentData = $this->argumentParser->parse($argumentNode); $typeArguments[$argumentName] = $this->argumentInterpreter->evaluate($argumentData); } break; case 'plugin': $pluginAttributes = $typeChildNode->attributes; $pluginDisabledNode = $pluginAttributes->getNamedItem('disabled'); $pluginSortOrderNode = $pluginAttributes->getNamedItem('sortOrder'); $pluginTypeNode = $pluginAttributes->getNamedItem('type'); $pluginData = array('sortOrder' => $pluginSortOrderNode ? (int) $pluginSortOrderNode->nodeValue : 0); if ($pluginDisabledNode) { $pluginData['disabled'] = $this->booleanUtils->toBoolean($pluginDisabledNode->nodeValue); } if ($pluginTypeNode) { $pluginData['instance'] = $pluginTypeNode->nodeValue; } $typePlugins[$pluginAttributes->getNamedItem('name')->nodeValue] = $pluginData; break; default: throw new \Exception("Invalid application config. Unknown node: {$typeChildNode->nodeName}."); } } $typeData['arguments'] = $typeArguments; if (!empty($typePlugins)) { $typeData['plugins'] = $typePlugins; } $output[$typeNodeAttributes->getNamedItem('name')->nodeValue] = $typeData; break; default: throw new \Exception("Invalid application config. Unknown node: {$node->nodeName}."); } } return $output; }