Dom.php 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. <?php
  2. /**
  3. * Module declaration xml converter. Converts declaration DOM Document to internal array representation.
  4. *
  5. * Copyright © Magento, Inc. All rights reserved.
  6. * See COPYING.txt for license details.
  7. */
  8. namespace Magento\Framework\Module\Declaration\Converter;
  9. class Dom implements \Magento\Framework\Config\ConverterInterface
  10. {
  11. /**
  12. * {@inheritdoc}
  13. * @throws \Exception
  14. */
  15. public function convert($source)
  16. {
  17. $modules = [];
  18. $xpath = new \DOMXPath($source);
  19. /** @var $moduleNode \DOMNode */
  20. foreach ($xpath->query('/config/module') as $moduleNode) {
  21. $moduleData = [];
  22. $moduleAttributes = $moduleNode->attributes;
  23. $nameNode = $moduleAttributes->getNamedItem('name');
  24. if ($nameNode === null) {
  25. throw new \Exception('Attribute "name" is required for module node.');
  26. }
  27. $moduleData['name'] = $nameNode->nodeValue;
  28. $versionNode = $moduleAttributes->getNamedItem('setup_version');
  29. $moduleData['setup_version'] = $versionNode ? $versionNode->nodeValue : null;
  30. $moduleData['sequence'] = [];
  31. /** @var $childNode \DOMNode */
  32. foreach ($moduleNode->childNodes as $childNode) {
  33. switch ($childNode->nodeName) {
  34. case 'sequence':
  35. $moduleData['sequence'] = $this->_readModules($childNode);
  36. break;
  37. }
  38. }
  39. // Use module name as a key in the result array to allow quick access to module configuration
  40. $modules[$nameNode->nodeValue] = $moduleData;
  41. }
  42. return $modules;
  43. }
  44. /**
  45. * Convert module depends node into assoc array
  46. *
  47. * @param \DOMNode $node
  48. * @return array
  49. * @throws \Exception
  50. */
  51. protected function _readModules(\DOMNode $node)
  52. {
  53. $result = [];
  54. /** @var $childNode \DOMNode */
  55. foreach ($node->childNodes as $childNode) {
  56. switch ($childNode->nodeName) {
  57. case 'module':
  58. $nameNode = $childNode->attributes->getNamedItem('name');
  59. if ($nameNode === null) {
  60. throw new \Exception('Attribute "name" is required for module node.');
  61. }
  62. $result[] = $nameNode->nodeValue;
  63. break;
  64. }
  65. }
  66. return $result;
  67. }
  68. }