Blogger Information
Blog 40
fans 0
comment 1
visits 39759
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP 路由URL
Dong.
Original
960 people have browsed it

路由实现案例

  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中不允许有空格
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:实现路由的方式, 解析url的方式有多种的, 老师的只是基本一种而已
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post