Blogger Information
Blog 60
fans 5
comment 3
visits 65078
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP路由
longlong
Original
646 people have browsed it

1. 演示课堂案例

  • 示例URL: php.edu/luyou/demo2.php/my/show/id/10/p/5
  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 绑定成功

2. 选做部分

2.1 方法一:

  • 示例URL:php.edu/luyou/demo3.php/my/show/peter/15
  1. <?php
  2. namespace mvc_test;
  3. // 示例URL:-----> php.edu/luyou/demo3.php/my/show/peter/15
  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. // 取完名称和方法后,$pathinfo这个数组保存的值相当于就只剩类方法的参数了,所以直接回调
  19. // 但是有一个问题是,如果URL中把peter和15的位置互换,那该怎么确定第一个参数表示name,第二个表示id呢?
  20. // 我能想到的就是使用正则表达式对参数指定一些规则来验证,不过目前还不会正则表达式
  21. echo call_user_func_array([(new $controller()),$action],$pathinfo);

2.2 方法二:

  • 示例URL:php.edu/luyou/demo4.php/my/show/peter/15
  1. <?php
  2. namespace mvc_test;
  3. // 示例URL:-----> php.edu/luyou/demo4.php/my/show/peter/15
  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);

3. 总结

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:功能完成了
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
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!