博客列表 >PHP 路由URL

PHP 路由URL

Dong.
Dong.原创
2020年09月11日 15:35:36950浏览

路由实现案例

  1. <?php
  2. // 解析URL,绑定到类方法
  3. namespace mvc_test;
  4. class MyController
  5. {
  6. public function show ($id,$p)
  7. {
  8. return 'id='.$id.'----'.'p='.$p;
  9. }
  10. }
  11. // 示例: URL为----> php.edu/luyou/demo2.php/my/show/id/10/p/5
  12. // 1. 获取路径
  13. // echo $_SERVER['PATH_INFO']; ----> /my/show/id/10/p=5
  14. // print_r(explode("/",$_SERVER['PATH_INFO']));
  15. // Array
  16. // (
  17. // [0] =>
  18. // [1] => my
  19. // [2] => show
  20. // [3] => id
  21. // [4] => 10
  22. // [5] => p
  23. // [6] => 5
  24. // )
  25. // 使用array_filter() 过滤空元素
  26. // 使用array_values() 将数据键名重置,从0开始
  27. $pathinfo = array_values(array_filter(explode("/",$_SERVER['PATH_INFO'])));
  28. // print_r($pathinfo);
  29. // Array
  30. // (
  31. // [0] => my
  32. // [1] => show
  33. // [2] => id
  34. // [3] => 10
  35. // [5] => p
  36. // [6] => 5
  37. // )
  38. // 2. 解析路径
  39. // $controller = array_shift($pathinfo);
  40. // echo $controller; ----> my
  41. $controller = __NAMESPACE__."\\".ucfirst(array_shift($pathinfo))."Controller";
  42. // echo $controller; -----> mvc_test\MyController
  43. // print_r($pathinfo);
  44. // Array
  45. // (
  46. // [0] => show
  47. // [1] => id
  48. // [2] => 10
  49. // [3] => p
  50. // [4] => 5
  51. // )
  52. $action = array_shift($pathinfo);
  53. // echo $action; ----> show
  54. // 测试从URL到控制器方法的映射
  55. // echo (new $controller())->$action(2,5);
  56. // id=2----p=5
  57. // 测试映射成功,现在来取参数
  58. // print_r($pathinfo);
  59. // Array
  60. // (
  61. // [0] => id
  62. // [1] => 10
  63. // [2] => p
  64. // [3] => 5
  65. // )
  66. $params = [];
  67. for ($i=0;$i<count($pathinfo);$i+=2) {
  68. // 加上判断,防止后面还有不认识的参数(无值的参数)
  69. if (isset($pathinfo[$i+1])){
  70. $params[$pathinfo[$i]] = $pathinfo[$i+1];
  71. }
  72. }
  73. // print_r($params);
  74. // Array
  75. // (
  76. // [id] => 10
  77. // [p] => 5
  78. // )
  79. echo call_user_func_array([(new $controller()),$action],$params);
  80. // 最后输出 id=10----p=5 绑定成功

扩展:URL中的pathinfo参数不使用键名,全部由值组成的实现

  • 方法一

  1. <?php
  2. namespace mvc_test;
  3. // 示例URL:-----> php.edu/luyou/demo3.php/my/show/demo/11
  4. // 控制器
  5. class MyController
  6. {
  7. public function show ($name,$id)
  8. {
  9. return '姓名: '.$name.'<br>'.'id: '.$id;
  10. }
  11. }
  12. // 获取路径:方法一:
  13. $pathinfo = array_values(array_filter(explode("/",$_SERVER['PATH_INFO'])));
  14. // 类名称
  15. $controller = __NAMESPACE__."\\".ucfirst(array_shift($pathinfo))."Controller";
  16. // 类方法
  17. $action = array_shift($pathinfo);
  18. echo call_user_func_array([(new $controller()),$action],$pathinfo);
  • 方法二

  1. <?php
  2. namespace mvc_test;
  3. // 示例URL:-----> php.edu/luyou/demo4.php/my/show/demo/11
  4. // 控制器
  5. class MyController
  6. {
  7. public function show ($name,$id)
  8. {
  9. return '姓名: '.$name.'<br>'.'id: '.$id;
  10. }
  11. }
  12. // 获取路径:方法二:
  13. $pathinfo = explode("/",substr($_SERVER['PATH_INFO'],1));
  14. // 类名称
  15. $controller = __NAMESPACE__."\\".ucfirst(array_shift($pathinfo))."Controller";
  16. // 类方法
  17. $action = array_shift($pathinfo);
  18. echo call_user_func_array([(new $controller()),$action],$pathinfo);

总结

  • 路由:只要是采用MVC架构的项目,它的URL最终都会映射到一个类中的方法上(函数),比如show()方法
  • pathinfo把url中所有成员或部分成员解析出来,跳过控制器和方法,把没有值的排除掉
  • URL中不允许有空格
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议