Blogger Information
Blog 9
fans 0
comment 0
visits 6866
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
路由原理 获取控制器和方法以及获取参数的两种方法
移动用户-1144300
Original
774 people have browsed it

路由原理

目标:将 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);
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