EndpointTrait.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <?php
  2. namespace AlibabaCloud\Client\Traits;
  3. use AlibabaCloud\Client\AlibabaCloud;
  4. use AlibabaCloud\Client\Config\Config;
  5. use AlibabaCloud\Client\Exception\ClientException;
  6. use AlibabaCloud\Client\Filter\ApiFilter;
  7. use AlibabaCloud\Client\Filter\ClientFilter;
  8. use AlibabaCloud\Client\Filter\HttpFilter;
  9. use AlibabaCloud\Client\Regions\LocationService;
  10. use AlibabaCloud\Client\Request\Request;
  11. use InvalidArgumentException;
  12. /**
  13. * Help developers set up and get host.
  14. *
  15. * @package AlibabaCloud\Client\Traits
  16. *
  17. * @mixin AlibabaCloud
  18. */
  19. trait EndpointTrait
  20. {
  21. /**
  22. * @var array Host cache.
  23. */
  24. private static $hosts = [];
  25. /**
  26. * Resolve host based on product name and region.
  27. *
  28. * @param string $product
  29. * @param string $regionId
  30. *
  31. * @return string
  32. * @throws ClientException
  33. */
  34. public static function resolveHost($product, $regionId = LocationService::GLOBAL_REGION)
  35. {
  36. ApiFilter::product($product);
  37. ClientFilter::regionId($regionId);
  38. if (isset(self::$hosts[$product][$regionId])) {
  39. return self::$hosts[$product][$regionId];
  40. }
  41. $domain = Config::get("endpoints.{$product}.{$regionId}");
  42. if (!$domain) {
  43. $regionId = LocationService::GLOBAL_REGION;
  44. $domain = Config::get("endpoints.{$product}.{$regionId}", '');
  45. }
  46. return $domain;
  47. }
  48. /**
  49. * @param $productCode
  50. *
  51. * @return bool
  52. */
  53. public static function isGlobalProduct($productCode)
  54. {
  55. $global = LocationService::GLOBAL_REGION;
  56. if (self::resolveHostByStatic($productCode, $global)) {
  57. return true;
  58. }
  59. $productCode = strtolower($productCode);
  60. return (bool)Config::get("endpoints.{$productCode}.{$global}");
  61. }
  62. /**
  63. * @param string $product
  64. * @param string $regionId
  65. *
  66. * @return string
  67. */
  68. public static function resolveHostByStatic($product, $regionId)
  69. {
  70. if (isset(self::$hosts[$product][$regionId])) {
  71. return self::$hosts[$product][$regionId];
  72. }
  73. return '';
  74. }
  75. /**
  76. * Add host based on product name and region.
  77. *
  78. * @param string $product
  79. * @param string $host
  80. * @param string $regionId
  81. *
  82. * @return void
  83. * @throws ClientException
  84. */
  85. public static function addHost($product, $host, $regionId = LocationService::GLOBAL_REGION)
  86. {
  87. ApiFilter::product($product);
  88. HttpFilter::host($host);
  89. ClientFilter::regionId($regionId);
  90. self::$hosts[$product][$regionId] = $host;
  91. LocationService::addHost($product, $host, $regionId);
  92. }
  93. /**
  94. * @param Request $request
  95. *
  96. * @return string
  97. * @throws ClientException
  98. */
  99. public static function resolveHostByRule(Request $request)
  100. {
  101. $network = $request->network ?: 'public';
  102. $suffix = $request->endpointSuffix;
  103. if ($network === 'public') {
  104. $network = '';
  105. }
  106. if ($request->endpointRegional === 'regional') {
  107. $regionId = $request->realRegionId();
  108. return "{$request->product}{$suffix}{$network}.{$regionId}.aliyuncs.com";
  109. }
  110. if ($request->endpointRegional === 'central') {
  111. return "{$request->product}{$suffix}{$network}.aliyuncs.com";
  112. }
  113. throw new InvalidArgumentException('endpointRegional is invalid.');
  114. }
  115. }