博客列表 >原生分页和layui分页,MVC架构原理与依赖注入

原生分页和layui分页,MVC架构原理与依赖注入

Jet的博客
Jet的博客原创
2023年03月26日 19:46:18383浏览

一、原生分页

1、pageData.php文件

根据上节课学习内容,使用pdo对数据库进行操作处理,读取具体数据和总条数进行渲染,分页按 总条数 / 每页多少条 得出页码。

  1. /**
  2. * 分页 limit子句
  3. * pageSize每页获取多绍条数据,当前页page 偏移量
  4. * order by 子句存在limit前面
  5. */
  6. // 页码来自get参数
  7. $page = $_GET['page'] ?? 1;
  8. // 越界检测
  9. $page = $page<1 ? 1: $page;
  10. // 每页显示数量
  11. $pageSize = 4;
  12. // 偏移量 offset
  13. $offset = ($page - 1) * $pageSize;
  14. $db = new PDO('mysql:host=localhost;dbname=phpcn22','root','root');
  15. $sql = 'select id,uname,status from user limit ?,?;';
  16. $stmt = $db->prepare($sql);
  17. $stmt->bindParam(1,$offset,PDO::PARAM_INT);
  18. $stmt->bindParam(2,$pageSize,PDO::PARAM_INT);
  19. $stmt->execute();
  20. $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
  21. // print_r($users);
  22. // 计算总页数
  23. // 1. 计算数据表里所有的记录
  24. $sql = 'SELECT COUNT(id) AS count FROM user;';
  25. $stmt = $db->prepare($sql);
  26. $stmt->execute();
  27. // 获取总页数方法1 :
  28. /* 查询结果里的字段绑定到一个变量上
  29. $stmt->bindColumn('count',$total);
  30. $stmt->fetch();
  31. */
  32. // 获取总页数方法2 :
  33. $total = $stmt->fetch()['count'];
  34. $pages = ceil( $total / $pageSize );

2、index.php文件

  1. <?php
  2. require 'pageData.php';
  3. ?>
  4. <!DOCTYPE html>
  5. <html lang="zh-CN">
  6. <head>
  7. <meta charset="UTF-8">
  8. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  9. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  10. <link rel="stylesheet" href="style.css">
  11. <title>Document</title>
  12. </head>
  13. <body>
  14. <table border="1">
  15. <caption>用户表</caption>
  16. <thead>
  17. <tr>
  18. <th>编号</th>
  19. <th>用户名</th>
  20. <th>手机号码</th>
  21. <th>状态</th>
  22. <th>操作</th>
  23. </tr>
  24. </thead>
  25. <tbody>
  26. <?php foreach ($users as $user): ?>
  27. <tr>
  28. <td><?= $user['id'] ?></td>
  29. <td><?= $user['uname'] ?></td>
  30. <td>13800138000</td>
  31. <td><?= $user['status'] == 1 ? '正常' : '注销' ?></td>
  32. <td>
  33. <button>删除</button>
  34. <button>编辑</button>
  35. </td>
  36. </tr>
  37. <?php endforeach; ?>
  38. </tbody>
  39. </table>
  40. <p>
  41. <!-- 动态生成分页 -->
  42. <?php
  43. // 上一页
  44. $prev = $page - 1;
  45. // if (expr) {expr1}
  46. // 系统先判断expr是否为真,如果是,则执行后面的语句,
  47. // 如果否,后面的语句就没有执行的必要了;转换成IF语句为
  48. if ($page == 1) $prev = 1;
  49. if ($page != 1) :
  50. ?>
  51. <a href="<?= '?page=' . $prev ?>">上一页</a>
  52. <?php endif; ?>
  53. <?php for($i=1; $i<=$pages; $i++) :
  54. $active = ($i == $page) ? 'active' : null;
  55. ?>
  56. <a href="<?= '?page=' . $i ?>" class="<?= $active ?>"><?= $i ?></a>
  57. <?php endfor ?>
  58. <?php
  59. // 下一页
  60. $next = $page + 1;
  61. if ($next == $page) $next = $page;
  62. // 当前页码不等于总页面,显示下一页
  63. if ($page != $pages) : ?>
  64. <a href="<?= '?page=' . $next ?>">下一页</a>
  65. <?php endif; ?>
  66. </p>
  67. </body>
  68. </html>

3、运行结果:


  1. 重点是index.php文件的 【动态生成分页】代码:
  2. 但是一个是混编,一个没有前后端分离,阅读起来有点费劲。

二、layui分页


1、PDO数据库操作不变。

2、index.php文件

  1. <?php
  2. require 'pageData.php';
  3. ?>
  4. <!DOCTYPE html>
  5. <html lang="zh-CN">
  6. <head>
  7. <meta charset="UTF-8">
  8. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  9. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  10. <link rel="stylesheet" href="style.css">
  11. <link rel="stylesheet" href="layui/css/layui.css">
  12. <title>Document</title>
  13. </head>
  14. <body>
  15. <table border="1">
  16. <caption>用户表</caption>
  17. <thead>
  18. <tr>
  19. <th>编号</th>
  20. <th>用户名</th>
  21. <th>手机号码</th>
  22. <th>状态</th>
  23. <th>操作</th>
  24. </tr>
  25. </thead>
  26. <tbody>
  27. <?php foreach ($users as $user): ?>
  28. <tr>
  29. <td><?= $user['id'] ?></td>
  30. <td><?= $user['uname'] ?></td>
  31. <td>13800138000</td>
  32. <td><?= $user['status'] == 1 ? '正常' : '注销' ?></td>
  33. <td>
  34. <button>删除</button>
  35. <button>编辑</button>
  36. </td>
  37. </tr>
  38. <?php endforeach; ?>
  39. </tbody>
  40. </table>
  41. <div id="page">
  42. </div>
  43. <script src="layui/layui.js"></script>
  44. <script>
  45. layui.use(['laypage'],function(){
  46. var laypage = layui.laypage;
  47. //执行一个laypage实例
  48. laypage.render({
  49. elem: 'page' //注意,这里的 test1 是 ID,不用加 # 号
  50. ,
  51. count: <?= $total ?> //数据总数,从服务端得到
  52. ,
  53. limit: <?= $pageSize ?>,
  54. curr: <?= $page ?>
  55. ,
  56. layout: ['prev', 'page', 'next', 'count'],
  57. jump: function(obj, first) {
  58. // obj包含了当前分页的所有参数,比如:
  59. //首次不执行
  60. if (!first) {
  61. window.location.href = '?page=' + obj.curr;
  62. }
  63. }
  64. });
  65. });
  66. </script>

2、运行结果:


  1. 使用layui插件方便快捷,代码易读性良好!

三、MVC架构

MVC框架理解:

  • M:model模型,对数据库管理、操作;
  • V:view试图,前端视图格式化;
  • C:controller控制器,请求派发器,用户点击等事件进行处理。

案例:

1、Medel.php文件

  1. <?php
  2. // 模型 数据操作
  3. namespace mvc_demo;
  4. use PDO;
  5. class Model
  6. {
  7. public function getData()
  8. {
  9. return (new PDO('mysql:host=localhost;dbname=phpcn22;','root','root'))
  10. ->query('select id, uname, status from user order by id asc limit 0,5')
  11. ->fetchAll(PDO::FETCH_ASSOC);
  12. }
  13. public function editData()
  14. {
  15. }
  16. }

2、View.php文件

  1. <?php
  2. namespace mvc_demo;
  3. class view
  4. {
  5. public function fetch($data)
  6. {
  7. $table = '<table>';
  8. $table .= '<caption>用户信息表</caption>';
  9. $table .= '<tr><th>编号</th><th>姓名</th><th>手机号</th><th>状态</th><th>操作</th></tr>';
  10. foreach ($data as $user) {
  11. $user['status'] = $user['status'] == 1 ? '正常' : '注销';
  12. $table .= '<tr>';
  13. $table .= '<td>' . $user['id'] . '</td>';
  14. $table .= '<td>' . $user['uname'] . '</td>';
  15. $table .= '<td>13800138000</td>';
  16. $table .= '<td>' . $user['status'] . '</td>';
  17. $table .= '<td><button>删除</button><button>编辑</button></td>';
  18. $table .= '</tr>';
  19. }
  20. $table .= '</table>';
  21. return $table;
  22. }
  23. }
  24. $data = (new Model)->getData();
  25. echo (new View)->fetch($data);

3、Controller.php文件

  1. <?php
  2. namespace mvc_demo;
  3. require 'Model.php';
  4. require 'View.php';
  5. class Controller
  6. {
  7. protected $model;
  8. protected $view;
  9. // 依赖注入其实本质上是指对类的依赖通过构造器完成自动注入
  10. // 通过构造方法将外部对象初始化,实现了外部依赖注入的对象在类内部的共享/复用
  11. public function __construct(Model $model,View $view)
  12. {
  13. $this->model = $model;
  14. $this->view = $view;
  15. }
  16. // 在控制器架构方法和操作方法中,一旦对参数进行对象类型约束则会自动触发依赖注入
  17. // 在操作方法中注入
  18. public function index(Model $model,View $view)
  19. {
  20. // 1. 获取数据 Model
  21. $data = $this->model->getData();
  22. // 2. 视图渲染 View
  23. $this->view->fetch($data);
  24. }
  25. public function edit(Model $model)
  26. {
  27. $this->model->editData();
  28. }
  29. }
  30. $model = new Model;
  31. $view = new View;
  32. //echo ($new Controller($model,$view))->index($model, $view);
  33. $c = new Controller($model,$view);
  34. call_user_func_array([$c,'index'],[$model,$view]);

运行结果:


总结:

  1. `Model`:数据库类,对数据库管理、操作;
  2. `View`:视图类,对前天视图的格式化;
  3. `Controller`:控制器类,请求派发器,对用户事件进行处理
  4. - 控制方法,构造方法,调用方法,获取数据
  5. `依赖注入`:将模型和视图的实例化过程,放在控制器的外部进行实现,作为参数,注入到控制器的方法中。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议