Normal.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <?php
  2. namespace Qii\Route\Parse;
  3. /**
  4. * Route规则文件
  5. * 兼容以前版本的匹配规则
  6. *
  7. * @author Jinhui Zhu<jinhui.zhu@live.cn>2015-10-24 23:11
  8. * @version 1.2
  9. */
  10. class Normal
  11. {
  12. const VERSION = '1.2';
  13. private $config;
  14. public function __construct()
  15. {
  16. }
  17. /**
  18. * 设置路由规则
  19. * @param Array $config 路由规则
  20. */
  21. public function setConfig($config)
  22. {
  23. $this->config = $config;
  24. }
  25. /**
  26. * 路由转发, 转发对应的规则中xx不能为*
  27. *
  28. * @param String $controller
  29. * @param String $action
  30. * @return Array ($controller, $action);
  31. *
  32. * *:* => *:yyy 所有controller和action都转发到 *->yyy
  33. * *:* => yy:* 所有转发到xxx->*, 这里的*,前边对应的是什么,后边就对应转发到什么,比如: *:xxx => yy:yyy
  34. * xx:* => yy:* xx中对应的方法转发到yy对应的方法
  35. * xx:* => yy:yyy xxx Controller转发到 yy->yyy
  36. * *:xxx => yy:yyy 所有Controller转发到 yy->yyy
  37. * xxx:*(yy):第三个参数 => {1}:* 转发xxx:yy => yy:第三个参数
  38. */
  39. public function parse($controller, $action, $thirdParam = '')
  40. {
  41. if (!$this->config) {
  42. return array('controller' => $controller, 'action' => $action);
  43. }
  44. $routerArray = array();
  45. if (is_array($this->config)) {
  46. foreach ($this->config AS $key => $value) {
  47. $keyArray = explode(":", $key);
  48. $valueArray = explode(":", $value);
  49. if (!isset($keyArray[1])) $keyArray[1] = '';
  50. if (!isset($valueArray[1])) $valueArray[1] = '';
  51. if ('' == $keyArray[1]) {
  52. $keyArray[1] = "*";
  53. }
  54. $routerArray['controller'][$keyArray[0] . ":" . $keyArray[1]] = $valueArray[0];
  55. if ($valueArray[1] == '*') $valueArray[1] = $action;
  56. if ($keyArray[1] == "*") {
  57. $routerArray['action'][$keyArray[0] . ":" . $keyArray[1]] = $valueArray[1];
  58. } else {
  59. $routerArray['action'][$keyArray[0] . ":" . $keyArray[1]] = $valueArray[1];
  60. }
  61. }
  62. }
  63. if (count($routerArray) == 0) {
  64. return array('controller' => $controller, 'action' => $action);
  65. }
  66. if (isset($routerArray["controller"]["*:*"]) && '' != $routerArray["controller"]["*:*"])//*:*=>yyy:* or *:* => *:yyy mode
  67. {
  68. $controller = ($routerArray['controller']['*:*'] == '*' ? $controller : $routerArray["controller"]["*:*"]);
  69. $action = ($routerArray['action']['*:*'] == '*' ? $action : $routerArray['action']['*:*']);
  70. } elseif (isset($routerArray["action"][$controller . ":*"]) && '' != $routerArray["action"][$controller . ":*"])//xx:*=>yy:* mode
  71. {
  72. $action = $routerArray['action'][$controller . ":*"];
  73. $controller = $routerArray["controller"][$controller . ":*"];
  74. if (stristr($controller, '{1}')) {
  75. $controller = str_replace('{1}', $action, $controller);
  76. $action = $thirdParam ? $thirdParam : 'index';
  77. }
  78. } elseif (isset($routerArray["action"]["*:" . $action]) && '' != $routerArray["action"]["*:" . $action])//*:xxx=> yy:yyy mode
  79. {
  80. $controller = $routerArray["control"]["*:" . $action];
  81. $action = $routerArray["action"]["*:" . $action];
  82. } elseif (isset($routerArray["controller"][$controller . ":" . $action])) {
  83. $tmpAction = $controller . ":" . $action;
  84. $action = $routerArray["action"][$controller . ":" . $action];
  85. $controller = $routerArray["controller"][$tmpAction];
  86. if (stristr($action, '{1}')) {
  87. $action = str_replace('{1}', $action, $thirdParam);
  88. }
  89. }
  90. $action = !$action ? 'index' : $action;
  91. return array('controller' => $controller, 'action' => $action);
  92. }
  93. }