EndpointTrait.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <?php
  2. namespace AlibabaCloud\Client\Traits;
  3. use InvalidArgumentException;
  4. use AlibabaCloud\Client\AlibabaCloud;
  5. use AlibabaCloud\Client\Config\Config;
  6. use AlibabaCloud\Client\Request\Request;
  7. use AlibabaCloud\Client\Filter\ApiFilter;
  8. use AlibabaCloud\Client\Filter\HttpFilter;
  9. use AlibabaCloud\Client\Filter\ClientFilter;
  10. use AlibabaCloud\Client\Regions\LocationService;
  11. use AlibabaCloud\Client\Exception\ClientException;
  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 string $product
  50. * @param string $regionId
  51. *
  52. * @return string
  53. */
  54. public static function resolveHostByStatic($product, $regionId)
  55. {
  56. if (isset(self::$hosts[$product][$regionId])) {
  57. return self::$hosts[$product][$regionId];
  58. }
  59. return '';
  60. }
  61. /**
  62. * Add host based on product name and region.
  63. *
  64. * @param string $product
  65. * @param string $host
  66. * @param string $regionId
  67. *
  68. * @return void
  69. * @throws ClientException
  70. */
  71. public static function addHost($product, $host, $regionId = LocationService::GLOBAL_REGION)
  72. {
  73. ApiFilter::product($product);
  74. HttpFilter::host($host);
  75. ClientFilter::regionId($regionId);
  76. self::$hosts[$product][$regionId] = $host;
  77. LocationService::addHost($product, $host, $regionId);
  78. }
  79. /**
  80. * @param Request $request
  81. *
  82. * @return string
  83. * @throws ClientException
  84. */
  85. public static function resolveHostByRule(Request $request)
  86. {
  87. $regionId = $request->realRegionId();
  88. $network = $request->network ?: 'public';
  89. $suffix = $request->endpointSuffix;
  90. if ($network === 'public') {
  91. $network = '';
  92. }
  93. if ($request->endpointRegional === 'regional') {
  94. return "{$request->product}{$suffix}{$network}.{$regionId}.aliyuncs.com";
  95. }
  96. if ($request->endpointRegional === 'central') {
  97. return "{$request->product}{$suffix}{$network}.aliyuncs.com";
  98. }
  99. throw new InvalidArgumentException('endpointRegional is invalid.');
  100. }
  101. }