Blogger Information
Blog 59
fans 6
comment 0
visits 52206
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
URL到控制器方法的映射,pathinfo参数只取id和name-php-34课8.5
希望
Original
731 people have browsed it

一、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中所有成员或部分成员解析出来,跳过控制器和方法,把没有值的排除掉
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:对url的解析 有许多方法的 , 其实js也可以做到的
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