Converter.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\MessageQueue\Consumer\Config\Xml;
  7. use Magento\Framework\MessageQueue\DefaultValueProvider;
  8. use Magento\Framework\MessageQueue\ConsumerInterface;
  9. use Magento\Framework\Communication\Config\ConfigParser;
  10. use Magento\Framework\Communication\ConfigInterface as CommunicationConfig;
  11. /**
  12. * Converts MessageQueue consumers config from \DOMDocument to array
  13. */
  14. class Converter implements \Magento\Framework\Config\ConverterInterface
  15. {
  16. /**
  17. * @var string
  18. */
  19. private static $defaultInstance = ConsumerInterface::class;
  20. /**
  21. * @var ConfigParser
  22. */
  23. private $configParser;
  24. /**
  25. * Default value provider.
  26. *
  27. * @var DefaultValueProvider
  28. */
  29. private $defaultValueProvider;
  30. /**
  31. * Initialize dependencies.
  32. *
  33. * @param ConfigParser $configParser
  34. * @param DefaultValueProvider $defaultValueProvider
  35. */
  36. public function __construct(ConfigParser $configParser, DefaultValueProvider $defaultValueProvider)
  37. {
  38. $this->configParser = $configParser;
  39. $this->defaultValueProvider = $defaultValueProvider;
  40. }
  41. /**
  42. * {@inheritDoc}
  43. */
  44. public function convert($source)
  45. {
  46. $result = [];
  47. /** @var $consumerNode \DOMElement */
  48. foreach ($source->getElementsByTagName('consumer') as $consumerNode) {
  49. $consumerName = $this->getAttributeValue($consumerNode, 'name');
  50. $handler = $this->getAttributeValue($consumerNode, 'handler');
  51. $result[$consumerName] = [
  52. 'name' => $consumerName,
  53. 'queue' => $this->getAttributeValue($consumerNode, 'queue'),
  54. 'consumerInstance' => $this->getAttributeValue(
  55. $consumerNode,
  56. 'consumerInstance',
  57. self::$defaultInstance
  58. ),
  59. 'handlers' => $handler ? [$this->parseHandler($handler)] : [],
  60. 'connection' => $this->getAttributeValue(
  61. $consumerNode,
  62. 'connection',
  63. $this->defaultValueProvider->getConnection()
  64. ),
  65. 'maxMessages' => $this->getAttributeValue($consumerNode, 'maxMessages')
  66. ];
  67. }
  68. return $result;
  69. }
  70. /**
  71. * Get attribute value of the given node
  72. *
  73. * @param \DOMNode $node
  74. * @param string $attributeName
  75. * @param mixed $default
  76. * @return string|null
  77. */
  78. private function getAttributeValue(\DOMNode $node, $attributeName, $default = null)
  79. {
  80. $item = $node->attributes->getNamedItem($attributeName);
  81. return $item ? $item->nodeValue : $default;
  82. }
  83. /**
  84. * Parse service method callback to become compatible with handlers format.
  85. *
  86. * @param array $handler
  87. * @return array
  88. */
  89. private function parseHandler($handler)
  90. {
  91. $parseServiceMethod = $this->configParser->parseServiceMethod($handler);
  92. return [
  93. CommunicationConfig::HANDLER_TYPE => $parseServiceMethod[ConfigParser::TYPE_NAME],
  94. CommunicationConfig::HANDLER_METHOD => $parseServiceMethod[ConfigParser::METHOD_NAME]
  95. ];
  96. }
  97. }