MetadataProcessor.php 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. <?php
  2. /**
  3. * Configuration metadata processor
  4. *
  5. * Copyright © Magento, Inc. All rights reserved.
  6. * See COPYING.txt for license details.
  7. */
  8. namespace Magento\Framework\App\Config;
  9. class MetadataProcessor
  10. {
  11. /**
  12. * @var \Magento\Framework\App\Config\Data\ProcessorFactory
  13. */
  14. protected $_processorFactory;
  15. /**
  16. * @var array
  17. */
  18. protected $_metadata = [];
  19. /**
  20. * @param \Magento\Framework\App\Config\Data\ProcessorFactory $processorFactory
  21. * @param Initial $initialConfig
  22. */
  23. public function __construct(
  24. \Magento\Framework\App\Config\Data\ProcessorFactory $processorFactory,
  25. Initial $initialConfig
  26. ) {
  27. $this->_processorFactory = $processorFactory;
  28. $this->_metadata = $initialConfig->getMetadata();
  29. }
  30. /**
  31. * Retrieve array value by path
  32. *
  33. * @param array $data
  34. * @param string $path
  35. * @return string|null
  36. */
  37. protected function _getValue(array $data, $path)
  38. {
  39. $keys = explode('/', $path);
  40. foreach ($keys as $key) {
  41. if (is_array($data) && array_key_exists($key, $data)) {
  42. $data = $data[$key];
  43. } else {
  44. return null;
  45. }
  46. }
  47. return $data;
  48. }
  49. /**
  50. * Set array value by path
  51. *
  52. * @param array &$container
  53. * @param string $path
  54. * @param string $value
  55. * @return void
  56. */
  57. protected function _setValue(array &$container, $path, $value)
  58. {
  59. $segments = explode('/', $path);
  60. $currentPointer = & $container;
  61. foreach ($segments as $segment) {
  62. if (!isset($currentPointer[$segment])) {
  63. $currentPointer[$segment] = [];
  64. }
  65. $currentPointer = & $currentPointer[$segment];
  66. }
  67. $currentPointer = $value;
  68. }
  69. /**
  70. * Process config data
  71. *
  72. * @param array $data
  73. * @return array
  74. */
  75. public function process(array $data)
  76. {
  77. foreach ($this->_metadata as $path => $metadata) {
  78. /** @var \Magento\Framework\App\Config\Data\ProcessorInterface $processor */
  79. $processor = $this->_processorFactory->get($metadata['backendModel']);
  80. $value = $processor->processValue($this->_getValue($data, $path));
  81. $this->_setValue($data, $path, $value);
  82. }
  83. return $data;
  84. }
  85. }