UrlBuilder.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Service\Utils;
  4. /**
  5. * Building url utilities.
  6. */
  7. class UrlBuilder
  8. {
  9. public function __construct(private string $baseUrl)
  10. {
  11. }
  12. /**
  13. * Concatenate a base url and a path.
  14. *
  15. * @param string $base The base url
  16. * @param array<string> $tails La suite de l'URL sous forme de tableau
  17. */
  18. public static function concatPath(string $base, array $tails): string
  19. {
  20. $url = $base;
  21. foreach ($tails as $tail) {
  22. $url = rtrim($url, '/').'/'.ltrim(strval($tail), '/');
  23. }
  24. return $url;
  25. }
  26. /**
  27. * Concatenate an url and a list of parameters.
  28. *
  29. * @param list<string|int> $parameters
  30. */
  31. public static function concatParameters(string $url, array $parameters = []): string
  32. {
  33. if (!$parameters) {
  34. return $url;
  35. }
  36. $url = rtrim($url, '?&/');
  37. $query = implode(
  38. '&',
  39. array_map(
  40. static function ($k, $v = '') {
  41. $q = urlencode((string) $k);
  42. if ((string) $v) {
  43. $q .= '='.urlencode((string) $v);
  44. }
  45. return $q;
  46. },
  47. array_keys($parameters),
  48. array_values($parameters)
  49. )
  50. );
  51. return $url.(str_contains($url, '?') ? '&' : '?').$query;
  52. }
  53. /**
  54. * Prepend the 'https://' part if neither 'http://' of 'https://' is present, else: does nothing.
  55. */
  56. public static function prependHttps(string $url): string
  57. {
  58. if (!preg_match('/^https?:\/\/.*/', $url)) {
  59. $url = 'https://'.$url;
  60. }
  61. return $url;
  62. }
  63. /**
  64. * Build an url.
  65. *
  66. * @param string $url The base url
  67. * @param array<string> $tails la suite de l'url sous forme de tableau
  68. * @param list<string> $parameters A list of parameters (can be an empty array)
  69. * @param bool $preprendHttps Should the 'https://' be prepended if missing
  70. */
  71. public static function concat(string $url, array $tails, array $parameters = [], bool $preprendHttps = false): string
  72. {
  73. $url = self::concatParameters(self::concatPath($url, $tails), $parameters);
  74. if ($preprendHttps) {
  75. $url = self::prependHttps($url);
  76. }
  77. return $url;
  78. }
  79. /**
  80. * Retourne l'URL relative sans le scheme et l'host.
  81. */
  82. public function getRelativeUrl(string $url): string
  83. {
  84. $parts = parse_url($url);
  85. return ($parts['path'] ?? '').(isset($parts['query']) ? '?'.$parts['query'] : '');
  86. }
  87. /**
  88. * Retourne l'URL absolue avec le scheme et l'host.
  89. */
  90. public function getAbsoluteUrl(string $path): string
  91. {
  92. return self::concat($this->baseUrl, [$path]);
  93. }
  94. }