19 $xpath = new \DOMXPath(
$source);
21 foreach ($xpath->query(
'/config/module') as $moduleNode) {
23 $moduleAttributes = $moduleNode->attributes;
24 $nameNode = $moduleAttributes->getNamedItem(
'name');
25 if ($nameNode ===
null) {
26 throw new \Exception(
'Attribute "name" is required for module node.');
28 $moduleData[
'name'] = $nameNode->nodeValue;
29 $versionNode = $moduleAttributes->getNamedItem(
'setup_version');
30 $moduleData[
'setup_version'] = $versionNode ? $versionNode->nodeValue :
null;
31 $moduleData[
'sequence'] = [];
33 foreach ($moduleNode->childNodes as $childNode) {
34 switch ($childNode->nodeName) {
36 $moduleData[
'sequence'] = $this->_readModules($childNode);
41 $modules[$nameNode->nodeValue] = $moduleData;
53 protected function _readModules(\DOMNode $node)
57 foreach ($node->childNodes as $childNode) {
58 switch ($childNode->nodeName) {
60 $nameNode = $childNode->attributes->getNamedItem(
'name');
61 if ($nameNode ===
null) {
62 throw new \Exception(
'Attribute "name" is required for module node.');
64 $result[] = $nameNode->nodeValue;