mvc程序中路由的映射,封装查询构造器

编辑: admin 分类: 电脑知识 发布时间: 2023-06-14 来源:互联网
一、mvc程序中路由的映射

原理:路由解析,从url地址中获取控制器、操作方法

1、Route.php文件

文件路径:20230316\app\admin\controller\User.php

  1. namespace app\admin\controller;
  2. require '../app/admin/controller/User.php';
  3. class Route
  4. {
  5. // 路由解析
  6. public static function parse()
  7. {
  8. // array_key_exists 判断数组下标是否存在(键值 索引)
  9. // 判断超全局函数$_SERVER是否存在'PATH_INFO'下标
  10. if ( array_key_exists('PATH_INFO',$_SERVER ) && ['PATH_INFO'] !== '/')
  11. {
  12. $pathinfo = array_values(array_filter(explode('/', $_SERVER['PATH_INFO'])));
  13. // explode 分割函数
  14. // array_filter 返回过滤数组中为空的元素
  15. // array_values 获取数组中所有元素的值(或者是说重新索引)
  16. // print_r($pathinfo);
  17. if(count($pathinfo)>=2){
  18. // ucfirst 首字母大写
  19. //$controller = array_shift($pathinfo);
  20. $controller = __NAMESPACE__ . '\\' . ucfirst(array_shift($pathinfo));
  21. $action = array_shift($pathinfo);
  22. $params = $pathinfo; //输出 array(0=>peter, 1=>12345);
  23. } else {
  24. $controller = array_shift($pathinfo);
  25. }
  26. }
  27. // 从url中解析出控制器 操作方法 参数列表
  28. return [$controller, $action, $params];
  29. }
  30. }
  31. $res = Route::parse();
  32. // call_user_func_array 调用回调函数,并把一个数组参数作为回调函数的参数
  33. // 两个参数:callback 被调用的函数,args 要被传入回调函数的数组,得是索引数组
  34. echo call_user_func_array([(new $res[0]), $res[1]] , $res[2]);

2、USER.php文件

文件路径:20230316\app\admin\controller\User.php

  1. <?php
  2. namespace app\admin\controller;
  3. class User
  4. {
  5. public function index($name, $id)
  6. {
  7. return "晚上好,{$name},您的编号为{$id}";
  8. }
  9. }
3、输出结果:


4、小结:
  • 解析路由,从url( http://tpedu.io/20230316/core/Route.php/user/index/peter/12345 )地址获取控制器、操作方法、参数
  • 映射到控制器 USER 下面的一个具体操作方法 index
  • 参数注入到 index 方法上;
  • 调用回调函数,作为数组参数作为回调函数的参数返回。


二、封装查询构造器
  1. <?php
  2. namespace core;
  3. use PDO;
  4. // 被委托的类:查询构造类
  5. class Query
  6. {
  7. protected PDO $db;
  8. protected string $table;
  9. protected string $field;
  10. protected string $limit;
  11. // 查询规则 子查询
  12. protected array $opts = [];
  13. // 构造器
  14. public function __construct(PDO $db)
  15. {
  16. $this->db = $db;
  17. }
  18. // 设置数据表
  19. // 返回类型 self 本对象
  20. public function table(string $table):self{
  21. $this->table = $table;
  22. return $this;
  23. }
  24. // 设置数据查询字段
  25. public function field(string $field='*'):self{
  26. $this->field = $field;
  27. return $this;
  28. }
  29. // 设置分页,每页显示数据条数
  30. public function limit(int $limit=10):self{
  31. $this->limit = $limit;
  32. $this->opts['limit'] = " LIMIT $limit";
  33. return $this;
  34. }
  35. // 设置分页,计算偏移量
  36. public function page(int $num=1):self{
  37. $this->opts['offset'] = ' OFFSET ' . ($num-1) * $this->limit;
  38. return $this;
  39. }
  40. // where 条件:数据表查询条件
  41. public function where(string $where = ''):self{
  42. $this->opts['where'] = " WHERE $where";
  43. return $this;
  44. }
  45. // 排序规则
  46. public function order($field, $order = 'DESC'): self
  47. {
  48. $this->opts['order'] = " ORDER BY $field $order ";
  49. return $this;
  50. }
  51. // 设置查询语句
  52. // 返回数组类型
  53. public function select(): array
  54. {
  55. $sql = 'SELECT ' . $this->field . ' FROM ' . $this->table;
  56. $sql .= $this->opts['where'] ?? null;
  57. $sql .= $this->opts['order'] ?? null;
  58. $sql .= $this->opts['limit'] ?? null;
  59. $sql .= $this->opts['offset'] ?? null;
  60. echo $sql;
  61. $stmt = $this->db->prepare($sql);
  62. $stmt->execute();
  63. return $stmt->fetchAll(PDO::FETCH_ASSOC);
  64. }
  65. // 更新语句
  66. public function update(array $data): int
  67. {
  68. $str = '';
  69. foreach ($data as $k => $v) {
  70. $str .= $k . '="' . $v . '",';
  71. }
  72. // 去掉最后一个逗号
  73. // rtrim 移除字符串右侧的空白字符或其他预定义字符
  74. $sql = 'UPDATE ' . $this->table . ' SET ' . rtrim($str, ',');
  75. $sql .= $this->opts['where'] ?? die('禁止无条件更新');
  76. $stmt = $this->db->prepare($sql);
  77. $stmt->execute();
  78. // 大于0表示更新成功,需要有返回值才能进行下一步工作
  79. return $stmt->rowCount();
  80. }
  81. }
【感谢龙石为本站提供数据api平台http://www.longshidata.com/pages/exchange.html】