博客列表 >路由原理 获取控制器和方法以及获取参数的两种方法

路由原理 获取控制器和方法以及获取参数的两种方法

移动用户-1144300
移动用户-1144300原创
2020年05月15日 22:25:21763浏览

路由原理

目标:将 URL 中的控制器,方法解析出来,映射到对应的控制器类和方法上

案例:http://localhost/php11/php/0514/task/route.php/user/getuser?id=1&name=prea

  1. // 这个里参数用GET方式出入
  2. class UserController
  3. {
  4. public function getUser($id, $name)
  5. {
  6. return "id=>$id name=>$name";
  7. }
  8. }
  9. // 解析PATHINFO
  10. // $_SERVER['PATH_INFO'];返回的是字符串,但我们需要的是数组
  11. // 第一个/前面没有内容会变成键值指向空
  12. print_r(explode('/', $_SERVER['PATH_INFO']));
  13. echo '<hr>';
  14. // 去空 重置索引
  15. echo '去空 重置索引';
  16. $pathinfo = array_values(array_filter(explode('/', $_SERVER['PATH_INFO'])));
  17. print_r($pathinfo);
  18. echo '<hr>';
  19. // 解析控制器
  20. // 通常喜欢加一个后缀所以在上面的类后面也要写上
  21. $controller = ucfirst(array_shift($pathinfo)) . 'Controller';
  22. echo $controller;
  23. echo '<hr>';
  24. // 解析控制器中的方法
  25. $action = array_shift($pathinfo);
  26. echo '类方法不区分大小写' . $action . '与getUser是一样的';
  27. echo '<hr>';
  28. // 解析参数
  29. // parse_str(查询字符串,数组)将解析的查询字符串放到数组里头
  30. // 注意:返回的是一个关联数组
  31. parse_str($_SERVER['QUERY_STRING'], $params);
  32. print_r($params);
  33. echo '<hr>';
  34. // 调用控制器
  35. // 类名可以用变量表示
  36. $user = new $controller;
  37. // 因为参数在一个索引数组里面
  38. // ... 只可以结构索引数组
  39. $params = array_values($params);
  40. echo $user->$action(...$params);

案例:http://localhost/php11/php/0514/task/route1.php/user/getuser/id/1/name/prea

  1. // 这个里参数用PATHIHFO方式出入
  2. class UserController
  3. {
  4. public function getUser($id, $name)
  5. {
  6. return "我的id=>$id 我的名字=>$name";
  7. }
  8. }
  9. // 解析PATHINFO
  10. // $_SERVER['PATH_INFO'];返回的是字符串,但我们需要的是数组
  11. // 第一个/前面没有内容会变成键值指向空
  12. print_r(explode('/', $_SERVER['PATH_INFO']));
  13. echo '<hr>';
  14. // 去空 重置索引
  15. echo '去空 重置索引';
  16. $pathinfo = array_values(array_filter(explode('/', $_SERVER['PATH_INFO'])));
  17. print_r($pathinfo);
  18. echo '<hr>';
  19. // 解析控制器
  20. $controller = ucfirst(array_shift($pathinfo)) . 'Controller';
  21. echo $controller;
  22. echo '<hr>';
  23. // 解析控制器中的方法
  24. $action = array_shift($pathinfo);
  25. echo '类方法不区分大小写' . $action . '与getUser是一样的';
  26. echo '<hr>';
  27. // 解析参数
  28. // 判读数组中剩余的元素
  29. // print_r($pathinfo);
  30. $arr = [];
  31. for ($i = 0; $i < count($pathinfo); $i += 2) {
  32. // 不存在的值会返回null
  33. if ($pathinfo[$i + 1]) {
  34. $arr[$pathinfo[$i]] = $pathinfo[$i + 1];
  35. }
  36. }
  37. echo '<hr>';
  38. print_r($arr);
  39. echo '<hr>';
  40. // 调用控制器
  41. // 类名可以用变量表示
  42. $user = new $controller;
  43. // 因为参数在一个索引数组里面
  44. // ... 只可以结构索引数组
  45. $params = array_values($arr);
  46. echo $user->$action(...$params);
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议