Blogger Information
Blog 63
fans 8
comment 8
visits 50082
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP大牛成长之路:PHP大牛成长之路:MVC之路由入门
周Sir-BLOG
Original
797 people have browsed it

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参数信息映射到控制器中的方法,实现一个简单路由;
  • 主要都是数组操作,前期知识又重新学习了一遍;
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:这样的学习是正确的
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
Author's latest blog post