博客列表 >PHP路由

PHP路由

longlong
longlong原创
2020年08月06日 15:21:45633浏览

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. 总结

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议