博客列表 >URL到控制器方法的映射,pathinfo参数只取id和name-php-34课8.5

URL到控制器方法的映射,pathinfo参数只取id和name-php-34课8.5

希望
希望原创
2020年08月06日 18:38:50735浏览

一、URL到控制器方法的映射

  1. <?php
  2. // 路由原理
  3. // 只要是采用MVC架构的项目,它的URL最终都会映射到一个类中的方法上(函数)
  4. // http://php.edu/0805/demo1.php?controler=user&action=show
  5. class UserController
  6. {
  7. public function show()
  8. {
  9. return 'Hello Wrold';
  10. }
  11. }
  12. // 此时通过GET参数解析出来了控制器和方法
  13. // user 转换 UserController ,用ucfirst
  14. $controller = ucfirst($_GET['controller']) . 'Controller';
  15. $action = $_GET['action'];
  16. // echo (new $controller())->show();
  17. // 搜索引擎看到上面的具有GET参数的URL动态地址,并不喜欢,它喜欢静态地址
  18. http://php.edu/0805/demo1.php?controler=user&action=show
  19. // 将上面的地址改成: PATH_INFO格式
  20. // http://php.edu/0805/demo1.php/user/show
  21. // /user/show: 像服务器上的路径, path-info
  22. // URL地址字符串不支持空格,所以会自动转义它
  23. // 拿路径
  24. echo $_SERVER['PATH_INFO'], '<br>';
  25. // 拿到完整url:http://php.edu/0805/demo1.php/user/show
  26. echo $_SERVER['REQUEST_URI'], '<br>';
  27. // 拿get参数
  28. echo $_SERVER['QUERY_STRING'], '<br>';
  29. //将URL地址进行编码
  30. echo urlencode('p=6&name=peter zhu'), '<br>';
  31. echo urldecode('p%3D6%26name%3Dpeter+zhu');
  32. echo '<hr>';
  33. // parse_url(): 解决URL的各个部分,返回一个数组
  34. print_r(parse_url($_SERVER['REQUEST_URI']));
  35. echo '<hr>';
  36. // pathinfo(): 返回当前脚本的路径信息,返回一个数组
  37. print_r(pathinfo($_SERVER['REQUEST_URI']));
  38. echo '<hr>';
  39. //parse_str(): $_SERVER['QUERY_STRING'],将查询字符串以数组的方式返回
  40. parse_str($_SERVER['QUERY_STRING'], $res);
  41. print_r($res);
  42. echo '<hr>';
  43. // 生成一个查询字符串,模拟数据
  44. echo http_build_query(['id'=>20, 'email'=>'admin@php.cn', 'p'=>4]);
  45. // id=20&email=admin%40php.cn&p=4

二、pathinfo参数只读show方法里面的内容:你好!,id,name

  1. <?php
  2. namespace mvc;
  3. class UserController
  4. {
  5. public function show($id, $name)
  6. {
  7. return '你好!' . $name.',id= ' . $id;
  8. }
  9. }
  10. // array_filter()过滤掉空元素
  11. // array_values():将数据键名重置,从0开始
  12. $pathinfo = array_values(array_filter(explode('/',$_SERVER['PATH_INFO'])));
  13. // print_r($pathinfo);
  14. // 生成控制器名称
  15. // __NAMESPACE__返回命名空间,拼接,拿到完整
  16. $controller = __NAMESPACE__ . '\\' . ucfirst(array_shift($pathinfo)) . 'Controller';
  17. // 解析控制器方法:show
  18. $action = array_shift($pathinfo);
  19. // 测试从URL到控制器方法的访问映射
  20. // echo (new $controller)->$action();
  21. // echo call_user_func([(new $controller), $action]);
  22. // 从URL中解析出参数,跳过控制器和方法
  23. // 参数以path_info方式提供:/id/15/name/peter
  24. // print_r($pathinfo);此时$pathinfo保存着参数
  25. // print_r($pathinfo);
  26. // 数组只取id和name来显示,把没有值的排除掉
  27. $params = [];
  28. for ($i = 0; $i < count($pathinfo); $i+= 2) {
  29. if (isset($pathinfo[$i + 1])) $params[$pathinfo[$i]] = $pathinfo[$i + 1];
  30. }
  31. echo call_user_func_array([(new $controller), $action], $params);
  • 总结:
  • 路由:只要是采用MVC架构的项目,它的URL最终都会映射到一个类中的方法上(函数),比如show()方法
  • pathinfo把url中所有成员或部分成员解析出来,跳过控制器和方法,把没有值的排除掉
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议