RouteFactory.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. /**
  3. * @package Grav\Framework\Route
  4. *
  5. * @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
  6. * @license MIT License; see LICENSE file for details.
  7. */
  8. namespace Grav\Framework\Route;
  9. /**
  10. * Class RouteFactory
  11. * @package Grav\Framework\Route
  12. */
  13. class RouteFactory
  14. {
  15. /** @var string */
  16. private static $root = '';
  17. /** @var string */
  18. private static $language = '';
  19. /** @var string */
  20. private static $delimiter = ':';
  21. public static function createFromParts($parts)
  22. {
  23. return new Route($parts);
  24. }
  25. public static function createFromString($path)
  26. {
  27. $path = ltrim($path, '/');
  28. $parts = [
  29. 'path' => $path,
  30. 'query' => '',
  31. 'query_params' => [],
  32. 'grav' => [
  33. 'root' => self::$root,
  34. 'language' => self::$language,
  35. 'route' => $path,
  36. 'params' => ''
  37. ],
  38. ];
  39. return new Route($parts);
  40. }
  41. public static function getRoot()
  42. {
  43. return self::$root;
  44. }
  45. public static function setRoot($root)
  46. {
  47. self::$root = rtrim($root, '/');
  48. }
  49. public static function getLanguage()
  50. {
  51. return self::$language;
  52. }
  53. public static function setLanguage($language)
  54. {
  55. self::$language = trim($language, '/');
  56. }
  57. public static function getParamValueDelimiter()
  58. {
  59. return self::$delimiter;
  60. }
  61. public static function setParamValueDelimiter($delimiter)
  62. {
  63. self::$delimiter = $delimiter;
  64. }
  65. /**
  66. * @param array $params
  67. * @return string
  68. */
  69. public static function buildParams(array $params)
  70. {
  71. if (!$params) {
  72. return '';
  73. }
  74. $delimiter = self::$delimiter;
  75. $output = [];
  76. foreach ($params as $key => $value) {
  77. $output[] = "{$key}{$delimiter}{$value}";
  78. }
  79. return implode('/', $output);
  80. }
  81. /**
  82. * @param string $path
  83. * @param bool $decode
  84. * @return string
  85. */
  86. public static function stripParams($path, $decode = false)
  87. {
  88. $pos = strpos($path, self::$delimiter);
  89. if ($pos === false) {
  90. return $path;
  91. }
  92. $path = dirname(substr($path, 0, $pos));
  93. if ($path === '.') {
  94. return '';
  95. }
  96. return $decode ? rawurldecode($path) : $path;
  97. }
  98. /**
  99. * @param string $path
  100. * @return array
  101. */
  102. public static function getParams($path)
  103. {
  104. $params = ltrim(substr($path, strlen(static::stripParams($path))), '/');
  105. return $params !== '' ? static::parseParams($params) : [];
  106. }
  107. /**
  108. * @param string $str
  109. * @return array
  110. */
  111. public static function parseParams($str)
  112. {
  113. $delimiter = self::$delimiter;
  114. $params = explode('/', $str);
  115. foreach ($params as &$param) {
  116. $parts = explode($delimiter, $param, 2);
  117. if (isset($parts[1])) {
  118. $param[rawurldecode($parts[0])] = rawurldecode($parts[1]);
  119. }
  120. }
  121. return $params;
  122. }
  123. }