ReflectionGenerator.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Communication\Config;
  7. use Magento\Framework\Communication\ConfigInterface as Config;
  8. use Magento\Framework\Reflection\MethodsMap;
  9. /**
  10. * Communication config generator based on service methods reflection
  11. */
  12. class ReflectionGenerator
  13. {
  14. const DEFAULT_HANDLER = 'defaultHandler';
  15. /**
  16. * @var MethodsMap
  17. */
  18. private $methodsMap;
  19. /**
  20. * Initialize dependencies
  21. *
  22. * @param MethodsMap $methodsMap
  23. */
  24. public function __construct(MethodsMap $methodsMap)
  25. {
  26. $this->methodsMap = $methodsMap;
  27. }
  28. /**
  29. * Extract service method metadata.
  30. *
  31. * @param string $className
  32. * @param string $methodName
  33. * @return array
  34. */
  35. public function extractMethodMetadata($className, $methodName)
  36. {
  37. $result = [
  38. Config::SCHEMA_METHOD_PARAMS => [],
  39. Config::SCHEMA_METHOD_RETURN_TYPE => $this->methodsMap->getMethodReturnType($className, $methodName),
  40. Config::SCHEMA_METHOD_HANDLER => [
  41. Config::HANDLER_TYPE => $className,
  42. Config::HANDLER_METHOD => $methodName
  43. ]
  44. ];
  45. $paramsMeta = $this->methodsMap->getMethodParams($className, $methodName);
  46. foreach ($paramsMeta as $paramPosition => $paramMeta) {
  47. $result[Config::SCHEMA_METHOD_PARAMS][] = [
  48. Config::SCHEMA_METHOD_PARAM_NAME => $paramMeta[MethodsMap::METHOD_META_NAME],
  49. Config::SCHEMA_METHOD_PARAM_POSITION => $paramPosition,
  50. Config::SCHEMA_METHOD_PARAM_IS_REQUIRED => !$paramMeta[MethodsMap::METHOD_META_HAS_DEFAULT_VALUE],
  51. Config::SCHEMA_METHOD_PARAM_TYPE => $paramMeta[MethodsMap::METHOD_META_TYPE],
  52. ];
  53. }
  54. return $result;
  55. }
  56. /**
  57. * Generate config data based on service method signature.
  58. *
  59. * @param string $topicName
  60. * @param string $serviceType
  61. * @param string $serviceMethod
  62. * @param array|null $handlers
  63. * @param bool|null $isSynchronous
  64. * @return array
  65. */
  66. public function generateTopicConfigForServiceMethod(
  67. $topicName,
  68. $serviceType,
  69. $serviceMethod,
  70. $handlers = [],
  71. $isSynchronous = null
  72. ) {
  73. $methodMetadata = $this->extractMethodMetadata($serviceType, $serviceMethod);
  74. $returnType = $methodMetadata[Config::SCHEMA_METHOD_RETURN_TYPE];
  75. $returnType = ($returnType != 'void' && $returnType != 'null') ? $returnType : null;
  76. if (!isset($isSynchronous)) {
  77. $isSynchronous = $returnType ? true : false;
  78. } else {
  79. $returnType = ($isSynchronous) ? $returnType : null;
  80. }
  81. return [
  82. Config::TOPIC_NAME => $topicName,
  83. Config::TOPIC_IS_SYNCHRONOUS => $isSynchronous,
  84. Config::TOPIC_REQUEST => $methodMetadata[Config::SCHEMA_METHOD_PARAMS],
  85. Config::TOPIC_REQUEST_TYPE => Config::TOPIC_REQUEST_TYPE_METHOD,
  86. Config::TOPIC_RESPONSE => $returnType,
  87. Config::TOPIC_HANDLERS => $handlers
  88. ?: [self::DEFAULT_HANDLER => $methodMetadata[Config::SCHEMA_METHOD_HANDLER]]
  89. ];
  90. }
  91. /**
  92. * Generate topic name based on service type and method name.
  93. *
  94. * Perform the following conversion:
  95. * \Magento\Customer\Api\RepositoryInterface + getById =>
  96. * magento.customer.api.repositoryInterface.getById
  97. *
  98. * @param string $typeName
  99. * @param string $methodName
  100. * @return string
  101. */
  102. public function generateTopicName($typeName, $methodName)
  103. {
  104. $parts = explode('\\', ltrim($typeName, '\\'));
  105. foreach ($parts as &$part) {
  106. $part = lcfirst($part);
  107. }
  108. return implode('.', $parts) . '.' . $methodName;
  109. }
  110. }