Converter.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <?php
  2. /**
  3. * Routes configuration converter
  4. *
  5. * Copyright © Magento, Inc. All rights reserved.
  6. * See COPYING.txt for license details.
  7. */
  8. namespace Magento\Framework\App\Route\Config;
  9. class Converter implements \Magento\Framework\Config\ConverterInterface
  10. {
  11. /**
  12. * Convert config
  13. *
  14. * @param \DOMDocument $source
  15. * @return array
  16. */
  17. public function convert($source)
  18. {
  19. $output = [];
  20. /** @var \DOMNodeList $routers */
  21. $routers = $source->getElementsByTagName('router');
  22. /** @var \DOMNode $router */
  23. foreach ($routers as $router) {
  24. $routerConfig = [];
  25. foreach ($router->attributes as $attribute) {
  26. $routerConfig[$attribute->nodeName] = $attribute->nodeValue;
  27. }
  28. /** @var \DOMNode $routeData */
  29. foreach ($router->getElementsByTagName('route') as $routeData) {
  30. $routeConfig = [];
  31. foreach ($routeData->attributes as $routeAttribute) {
  32. $routeConfig[$routeAttribute->nodeName] = $routeAttribute->nodeValue;
  33. }
  34. /** @var \DOMNode $module */
  35. foreach ($routeData->getElementsByTagName('module') as $moduleData) {
  36. $moduleConfig = [];
  37. foreach ($moduleData->attributes as $moduleAttribute) {
  38. $moduleConfig[$moduleAttribute->nodeName] = $moduleAttribute->nodeValue;
  39. }
  40. $routeConfig['modules'][] = $moduleConfig;
  41. }
  42. $routeConfig['modules'] = $this->_sortModulesList($routeConfig['modules']);
  43. $routerConfig['routes'][$routeData->attributes->getNamedItem('id')->nodeValue] = $routeConfig;
  44. }
  45. $output[$router->attributes->getNamedItem('id')->nodeValue] = $routerConfig;
  46. }
  47. return $output;
  48. }
  49. /**
  50. * Sort modules list according to before/after attributes
  51. *
  52. * @param array $modulesList
  53. * @return array
  54. */
  55. protected function _sortModulesList($modulesList)
  56. {
  57. $sortedModulesList = [];
  58. foreach ($modulesList as $moduleData) {
  59. if (isset($moduleData['before'])) {
  60. $position = array_search($moduleData['before'], $sortedModulesList);
  61. if ($position === false) {
  62. $position = 0;
  63. }
  64. array_splice($sortedModulesList, $position, 0, $moduleData['name']);
  65. } elseif (isset($moduleData['after'])) {
  66. $position = array_search($moduleData['after'], $sortedModulesList);
  67. if ($position === false) {
  68. $position = count($modulesList);
  69. }
  70. array_splice($sortedModulesList, $position + 1, 0, $moduleData['name']);
  71. } else {
  72. $sortedModulesList[] = $moduleData['name'];
  73. }
  74. }
  75. return $sortedModulesList;
  76. }
  77. }