Validator.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\MessageQueue\Config\Reader\Env;
  7. use Magento\Framework\MessageQueue\ConfigInterface as QueueConfig;
  8. use Magento\Framework\MessageQueue\Config\Validator as ConfigValidator;
  9. use Magento\Framework\Reflection\MethodsMap;
  10. use Magento\Framework\Reflection\TypeProcessor;
  11. /**
  12. * Communication configuration validator. Validates data, that have been read from env.php.
  13. */
  14. class Validator extends ConfigValidator
  15. {
  16. /**
  17. * @var MethodsMap
  18. */
  19. private $methodsMap;
  20. /**
  21. * Initialize dependencies
  22. *
  23. * @param TypeProcessor $typeProcessor
  24. * @param MethodsMap $methodsMap
  25. */
  26. public function __construct(
  27. TypeProcessor $typeProcessor,
  28. MethodsMap $methodsMap
  29. ) {
  30. $this->methodsMap = $methodsMap;
  31. parent::__construct($typeProcessor, $methodsMap);
  32. }
  33. /**
  34. * Validate config data
  35. *
  36. * @param array $configData
  37. * @param array|null $xmlConfigData
  38. * @return void
  39. */
  40. public function validate($configData, array $xmlConfigData = [])
  41. {
  42. if (isset($configData[QueueConfig::TOPICS])) {
  43. foreach ($configData[QueueConfig::TOPICS] as $topicName => $configDataItem) {
  44. $schemaType = $configDataItem[QueueConfig::TOPIC_SCHEMA][QueueConfig::TOPIC_SCHEMA_VALUE];
  45. $responseSchemaType =
  46. $configDataItem[QueueConfig::TOPIC_RESPONSE_SCHEMA][QueueConfig::TOPIC_SCHEMA_VALUE];
  47. $publisherName = $configDataItem[QueueConfig::TOPIC_PUBLISHER];
  48. $this->validateSchemaType($schemaType, $topicName);
  49. $this->validateResponseSchemaType($responseSchemaType, $topicName);
  50. $this->validateTopicPublisher(
  51. $this->getAvailablePublishers($configData, $xmlConfigData),
  52. $publisherName,
  53. $topicName
  54. );
  55. }
  56. }
  57. if (isset($configData[QueueConfig::CONSUMERS])) {
  58. foreach ($configData[QueueConfig::CONSUMERS] as $consumerName => $configDataItem) {
  59. $handlers = isset($configDataItem[QueueConfig::CONSUMER_HANDLERS])
  60. ? $configDataItem[QueueConfig::CONSUMER_HANDLERS] : [];
  61. foreach ($handlers as $handler) {
  62. $this->validateHandlerType(
  63. $handler[QueueConfig::CONSUMER_CLASS],
  64. $handler[QueueConfig::CONSUMER_METHOD],
  65. $consumerName
  66. );
  67. }
  68. }
  69. }
  70. if (isset($configData[QueueConfig::BINDS])) {
  71. foreach ($configData[QueueConfig::BINDS] as $configDataItem) {
  72. $this->validateBindTopic(
  73. $this->getAvailableTopics($configData, $xmlConfigData),
  74. $configDataItem[QueueConfig::BIND_TOPIC]
  75. );
  76. }
  77. }
  78. }
  79. /**
  80. * Return all available publishers from xml and env configs
  81. *
  82. * @param array $configData
  83. * @param array $xmlConfigData
  84. * @return array
  85. */
  86. private function getAvailablePublishers($configData, $xmlConfigData)
  87. {
  88. $envConfigPublishers = isset($configData[QueueConfig::PUBLISHERS]) ? $configData[QueueConfig::PUBLISHERS] : [];
  89. $xmlConfigPublishers = isset($xmlConfigData[QueueConfig::PUBLISHERS])
  90. ? $xmlConfigData[QueueConfig::PUBLISHERS] : [];
  91. return array_unique(
  92. array_merge(
  93. array_keys($xmlConfigPublishers),
  94. array_keys($envConfigPublishers)
  95. )
  96. );
  97. }
  98. /**
  99. * Return all available topics from xml and env configs
  100. *
  101. * @param array $configData
  102. * @param array $xmlConfigData
  103. * @return array
  104. */
  105. private function getAvailableTopics($configData, $xmlConfigData)
  106. {
  107. $envConfigTopics = isset($configData[QueueConfig::TOPICS]) ? $configData[QueueConfig::TOPICS] : [];
  108. $xmlConfigTopics = isset($xmlConfigData[QueueConfig::TOPICS]) ? $xmlConfigData[QueueConfig::TOPICS] : [];
  109. return array_unique(
  110. array_merge(
  111. array_keys($xmlConfigTopics),
  112. array_keys($envConfigTopics)
  113. )
  114. );
  115. }
  116. }