博客列表 >PHP 25 url路由原理与composer安装(0805wed)

PHP 25 url路由原理与composer安装(0805wed)

老黑
老黑原创
2020年08月08日 09:20:24627浏览

主要内容:

  1. url路由机制:
    ① 路由机制就是把某一个特定形式的URL结构进行解析,提炼出系统对应的参数。如:http://main.test.com/article/1 其中:/article/1 -> ?_m=article&id=1。

    ② 然后将拥有对应参数的URL转换成特定形式的URL结构,也就是上面过程的逆向过程。

    ③ 如果一个页面的内容呈现,需要根据url上传递的参数来进行渲染。很多时候可能是这样子写:xxx.com/xx?c=x&m=x&t=..,而我们看到的url往往是这样子的(以新浪微游戏的咖啡恋人为例) game.weibo.com/ilovecoffee….这种URL设计看上去比前一种更好一点:) - (o - 伪静态)

    一些参考资料可以见这个网页:https://www.jb51.net/article/96576.htm

  2. 只要是采用MVC架构的项目,它的URL最终都会映射到一个类中的方法上(函数)。


1. 示例

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

2. 示例2

  1. <?php
  2. namespace mvc;
  3. class UserController
  4. {
  5. public function show($id, $name)
  6. {
  7. return 'Hello '. $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. $controller = __NAMESPACE__ . '\\' . ucfirst(array_shift($pathinfo)) . 'Controller';
  16. // 解析控制器方法
  17. $action = array_shift($pathinfo);
  18. // 测试从URL到控制器方法的访问映射
  19. // echo (new $controller)->$action();
  20. // echo call_user_func([(new $controller), $action]);
  21. // 从URL中解析出参数
  22. // 参数以path_info方式提供:/id/15/name/peter
  23. // print_r($pathinfo);此时$pathinfo保存着参数
  24. // print_r($pathinfo);
  25. $params = [];
  26. for ($i = 0; $i < count($pathinfo); $i+= 2) {
  27. if (isset($pathinfo[$i + 1])) $params[$pathinfo[$i]] = $pathinfo[$i + 1];
  28. }
  29. // print_r($params);
  30. echo call_user_func_array([(new $controller), $action], $params);

3. 作业内容

  1. 仿照课堂案例,实现一个简单的URL到控制器方法的映射
  2. 安装composer
  3. 选做: URL中的pathinfo参数不使用键名,全部由值组成,应该如何实现解析与引用,如 /10/peter, 而不是/id/10/name/peter格式?
  1. <?php
  2. namespace my_mvc_test;
  3. class MyController
  4. {
  5. public function show ($id,$p){
  6. return 'id='.$id.'----'.'p='.$p;
  7. }}
  8. $pathinfo = array_values(array_filter(explode("/",$_SERVER['PATH_INFO'])));
  9. $controller = __NAMESPACE__."\\".ucfirst(array_shift($pathinfo))."Controller";
  10. $action = array_shift($pathinfo);
  11. $params = [];
  12. for ($i=0;$i<count($pathinfo);$i+=2){
  13. if (isset($pathinfo[$i+1])){
  14. $params[$pathinfo[$i]] = $pathinfo[$i+1];
  15. }}
  16. print_r($params);
  17. echo call_user_func_array([(new $controller()),$action],$params);

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议