欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解刨mvc中pathinfo路由解析原理

程序员文章站 2024-04-04 12:30:47
...

解刨mvc中pathinfo路由解析原理
利用超全局函数拿到数组拿到的值,对值进行操作,操作后映射到方法中,
解析http ://*.com/demo1.php/user/index/id/1/name/user
代码部分:

  1. <?php
  2. namespace mvc;
  3. class User
  4. {
  5. function index($id, $name)
  6. {
  7. return "您好{$name},您的id是$id";
  8. }
  9. }
  10. // echo (new User)->index(1, 'pt');
  11. // var_dump($_SERVER['PATH_INFO']);
  12. // array_filter去除空字符 array_values将数组重新排序
  13. $res = array_values(array_filter(explode("/", $_SERVER['PATH_INFO'])));
  14. // var_dump($res);
  15. $controller = __NAMESPACE__ . '\\' . array_shift($res);
  16. //下面是方法名
  17. var_dump($controller);
  18. $method = array_shift($res);
  19. // 下面是控制器名
  20. var_dump($method);
  21. var_dump($res);
  22. // $params = ['id' => 1, 'name' => 'peter'];
  23. // i等于0的时候 i自增0+2赋值给i i等于2,
  24. for ($i = 0; $i < count($res); $i += 2) {
  25. // array(4) {
  26. // [0]=>
  27. // string(2) "id"
  28. // [1]=>
  29. // string(1) "1"
  30. // [2]=>
  31. // string(4) "name"
  32. // [3]=>
  33. // string(4) "user"
  34. // }
  35. // 解释下下面,丫的 刚刚差点没理解 for是从0开始进入的 妈的 这一个点让我头疼了半天
  36. // 第一次进来是$params[$res[$i]]是0 $res[$i + 1];为1,因为是从0开始的
  37. // 第二次进来 i就是2了 $params[$res[$i]]就是2了 , $res[$i + 1];就是3
  38. $params[$res[$i]] = $res[$i + 1];
  39. }
  40. // for上面实现的,下面是foreach实现的
  41. var_dump($params); //这里的params跟下面的ress都是一个数组,随便用...
  42. foreach ($res as $key => $value) {
  43. $ress['id'] = $res['1'];
  44. $ress['name'] = $res['3'];
  45. }
  46. var_dump($ress);
  47. // 第一种解决方法
  48. // $au = (new User)->index($ress['id'], $ress['name']);
  49. // var_dump($au);
  50. // 第二种回调的解决方法
  51. $ca = call_user_func_array([(new $controller), $method], [$ress['id'], $ress['name']]);
  52. // call_user_func_array 回调函数第一个值可以是一个数组,数组内第一个值是类名,第二个值是是类内的方法,第二个值是给第一个值注入的参数
  53. // 在没有类的情况下,第一个值就是一个方法,并且支持引用传递
  54. echo $ca;
  55. //上面是将api地址解析成数组
  56. //示例网址http://1.com/demo1.php/user/index/id/1/name/user

第二种,get方式传参,路由地址为/url/index?id=6&name=peter格式的

代码部分:

  1. <?php
  2. namespace mvc;
  3. class url
  4. {
  5. public function index($name, $id)
  6. {
  7. return "当前用户为" . $name . '.' . '当前用户的id为' . $id;
  8. }
  9. }
  10. var_dump($_SERVER['REQUEST_URI']);
  11. $url = $_SERVER['REQUEST_URI'];//获取到路由的地址
  12. $urlarr = parse_url($url);//将路由地址转数组
  13. var_dump($urlarr['query']);
  14. parse_str($urlarr['query'], $xarr);//将需要的get部分的路由地址转数组
  15. var_dump($xarr);
  16. echo (new url)->index($xarr['name'], $xarr['id']);//传值
  17. // 上面是将1.com/demo2.php/url/index?id=6&name=peter 中的id=6&name=peter转换成数组