Reader.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\MessageQueue\Topology\Config\RemoteService;
  7. use Magento\Framework\Communication\Config\ReflectionGenerator;
  8. use Magento\Framework\MessageQueue\Code\Generator\RemoteServiceGenerator;
  9. use Magento\Framework\MessageQueue\DefaultValueProvider;
  10. use Magento\Framework\MessageQueue\Topology\Config\ReaderInterface;
  11. use Magento\Framework\ObjectManager\ConfigInterface as ObjectManagerConfig;
  12. use Magento\Framework\Reflection\MethodsMap as ServiceMethodsMap;
  13. /**
  14. * Reader for queue topology configs based on remote service declaration in DI configs.
  15. */
  16. class Reader implements ReaderInterface
  17. {
  18. /**
  19. * @var DefaultValueProvider
  20. */
  21. private $defaultValueProvider;
  22. /**
  23. * @var ObjectManagerConfig
  24. */
  25. private $objectManagerConfig;
  26. /**
  27. * @var ReflectionGenerator
  28. */
  29. private $reflectionGenerator;
  30. /**
  31. * @var ServiceMethodsMap
  32. */
  33. private $serviceMethodsMap;
  34. /**
  35. * Initialize dependencies.
  36. *
  37. * @param DefaultValueProvider $defaultValueProvider
  38. * @param ObjectManagerConfig $objectManagerConfig
  39. * @param ReflectionGenerator $reflectionGenerator
  40. * @param ServiceMethodsMap $serviceMethodsMap
  41. */
  42. public function __construct(
  43. DefaultValueProvider $defaultValueProvider,
  44. ObjectManagerConfig $objectManagerConfig,
  45. ReflectionGenerator $reflectionGenerator,
  46. ServiceMethodsMap $serviceMethodsMap
  47. ) {
  48. $this->defaultValueProvider = $defaultValueProvider;
  49. $this->objectManagerConfig = $objectManagerConfig;
  50. $this->reflectionGenerator = $reflectionGenerator;
  51. $this->serviceMethodsMap = $serviceMethodsMap;
  52. }
  53. /**
  54. * {@inheritdoc}
  55. */
  56. public function read($scope = null)
  57. {
  58. $exchangeName = $this->defaultValueProvider->getExchange();
  59. return [
  60. $exchangeName => [
  61. 'name' => $exchangeName,
  62. 'type' => 'topic',
  63. 'connection' => $this->defaultValueProvider->getConnection(),
  64. 'durable' => true,
  65. 'autoDelete' => false,
  66. 'internal' => false,
  67. 'bindings' => $this->generateBindings(),
  68. 'arguments' => [],
  69. ]
  70. ];
  71. }
  72. /**
  73. * Generate list of bindings based on information about remote services declared in DI config.
  74. *
  75. * @return array
  76. *
  77. * @throws \LogicException
  78. *
  79. * @SuppressWarnings(PHPMD.UnusedLocalVariable)
  80. */
  81. private function generateBindings()
  82. {
  83. $bindings = [];
  84. foreach ($this->getRemoteServices() as $serviceInterface => $remoteImplementation) {
  85. try {
  86. $methodsMap = $this->serviceMethodsMap->getMethodsMap($serviceInterface);
  87. } catch (\Exception $e) {
  88. throw new \LogicException(sprintf('Service interface was expected, "%s" given', $serviceInterface));
  89. }
  90. foreach ($methodsMap as $methodName => $returnType) {
  91. $topic = $this->reflectionGenerator->generateTopicName($serviceInterface, $methodName);
  92. $exchangeName = $this->defaultValueProvider->getExchange();
  93. $destination = 'queue.' . $topic;
  94. $id = $topic . '--' . $exchangeName . '--' . $destination;
  95. $bindings[$id] = [
  96. 'id' => $id,
  97. 'destinationType' => 'queue',
  98. 'destination' => $destination,
  99. 'disabled' => false,
  100. 'topic' => $topic,
  101. 'arguments' => []
  102. ];
  103. }
  104. }
  105. return $bindings;
  106. }
  107. /**
  108. * Get list of remote services declared in DI config.
  109. *
  110. * @return array
  111. */
  112. private function getRemoteServices()
  113. {
  114. $preferences = $this->objectManagerConfig->getPreferences();
  115. $remoteServices = [];
  116. foreach ($preferences as $type => $preference) {
  117. if ($preference == $type . RemoteServiceGenerator::REMOTE_SERVICE_SUFFIX) {
  118. $remoteServices[$type] = $preference;
  119. }
  120. }
  121. return $remoteServices;
  122. }
  123. }