博客列表 >PHP大牛成长之路:PHP大牛成长之路:MVC之路由入门

PHP大牛成长之路:PHP大牛成长之路:MVC之路由入门

周Sir-BLOG
周Sir-BLOG原创
2020年08月08日 21:40:47796浏览

1、路由入门

例子:User 控制器中有2个方法

  1. class User
  2. {
  3. public function show()
  4. {
  5. return '我来自广东!';
  6. }
  7. }

直接访问
如:http://php.pro/0805/demo1.php

  1. // 直接访问:(忽略URL中参数)
  2. echo (new User())->show(); //输出:我来自广东!`

通过Get参数访问

如:http://php.pro/0805/demo1.php?controller=user&action=show
//输出:我来自广东!

  1. // ucfirst() 函数把字符串中的首字符转换为大写
  2. // 1、获取URL控制器名称
  3. $controller = ucfirst($_GET['controller']);
  4. // 2、获取URL方法名称
  5. $action = $_GET['action'];
  6. // 3、将获取的URL映射到一个类中的方法
  7. echo (new $controller())->$action();
  • 只要是采用MVC架构的项目,它的URL最终都会映射到一个类中的方法上(函数)上,如下图所示:

  • 搜索引擎看到上面的具有GET参数的URL动态地址,并不喜欢,它喜欢静态地址(通过伪静态实现)

2、路由示例(伪静态:PATH_INFO方式)

2.1 示例1:键值对关系的URL(user/show/id/5/name/peter)

  1. namespace mvc;
  2. class User
  3. {
  4. public function show($id, $name)
  5. {
  6. return '你好:'. $name.',你的id是:' . $id;
  7. }
  8. }
  9. // 1、得到PATH_INFO信息
  10. // $pathinfo = /user/show/id/15/name/peter
  11. $pathinfo = $_SERVER['PATH_INFO'];
  12. // 2、将PATH_INFO信息转为数组
  13. // $pathinfoAr = Array ( [0] => [1] => user [2] => show [3] => id [4] => 15 [5] => name [6] => peter )
  14. $pathinfoArr=explode('/',$pathinfo);
  15. // 3、使用array_filter()过滤掉空元素
  16. // $pathinfoArr1 = Array ( [1] => user [2] => show [3] => id [4] => 15 [5] => name [6] => peter )
  17. $pathinfoArr1=array_filter($pathinfoArr);
  18. // 4、使用array_values():将数据键名重置,从0开始
  19. // $pathinfoArr2 = Array ( [0] => user [1] => show [2] => id [3] => 15 [4] => name [5] => peter )
  20. $pathinfoArr2=array_values($pathinfoArr1);
  21. // 5、从数组中获取控制器名称(包含命名空间)
  22. // array_shift() 删除数组中第一个元素,并返回被删除元素的值(就是数组中的控制器名称)
  23. // ucfirst() 将控制器名称首字母大写
  24. // $controller = mvc\User
  25. $controller = __NAMESPACE__ . '\\' . ucfirst(array_shift($pathinfoArr2));
  26. // 6、从数组中获取控制器方法
  27. // $action = show
  28. $action = array_shift($pathinfoArr2);
  29. // 7、测试从URL到控制器方法的访问映射
  30. ;
  31. // 从URL中解析出参数
  32. // http://php.pro/0805/demo1.php/user/show/id/15/name/peter
  33. $params = [];
  34. for ($i = 0; $i < count($pathinfoArr2); $i+= 2) {
  35. if (isset($pathinfoArr2[$i + 1])) $params[$pathinfoArr2[$i]] = $pathinfoArr2[$i + 1];
  36. }
  37. // 使用对象数组
  38. // echo (new $controller())->$action($params['id'],$params['name']);
  39. // 使用回调函数处理数组
  40. echo call_user_func_array([(new $controller), $action], $params);

2.2 示例2:只有值的URL(user/show/5/peter)

  1. namespace mvc;
  2. // http://php.pro/0805/demo1.php/user/show/15/peter
  3. // 使用控制器名称+方法+参数(值)方式访问
  4. // 思路:pathinfo第一个控制器名称,第二个方法名称,最后获取参数(值)
  5. class User
  6. {
  7. public function show($id, $name)
  8. {
  9. return '你好:'. $name.',你的id是:' . $id;
  10. }
  11. }
  12. // 获取命名空间
  13. function getNamespace(){
  14. return __NAMESPACE__;
  15. }
  16. // 获取类名
  17. function getClass($pathinfo){
  18. $class=array_shift(array_values(array_filter(explode('/',$pathinfo))));
  19. return $class;
  20. }
  21. // 获取方法名
  22. function getMethod($pathinfo){
  23. $arr=array_values(array_filter(explode('/',$pathinfo)));
  24. array_shift($arr);
  25. $method = array_shift($arr);
  26. return $method;
  27. }
  28. // 获取控制器(含命名空间)mvc\User
  29. function getController(){
  30. $controller = getNamespace(). '\\' . ucfirst(getClass($_SERVER['PATH_INFO']));
  31. return $controller;
  32. }
  33. // echo getController();
  34. // 获取方法参数
  35. // array_splice()删除数组指定长度元素并返回删除元素
  36. function getParameter($pathinfo){
  37. $parameter=array_splice(array_values(array_filter(explode('/',$pathinfo))),2,2);
  38. return $parameter;
  39. }
  40. $parameter=getParameter($_SERVER['PATH_INFO']);
  41. $controller=getController();
  42. $action=getMethod($_SERVER['PATH_INFO']);
  43. // 使用对象数组参数
  44. // echo (new $controller())->$action($parameter[0],$parameter[1]);
  45. // 使用回调函数处理
  46. echo call_user_func_array([(new $controller), $action], $parameter);

总结

  • 通过 $_SERVER['PATH_INFO']) 获取URL参数信息映射到控制器中的方法,实现一个简单路由;
  • 主要都是数组操作,前期知识又重新学习了一遍;
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议