博客列表 >12月7日-迷你MVC框架-***线上九期班

12月7日-迷你MVC框架-***线上九期班

邯郸易住宋至刚
邯郸易住宋至刚原创
2019年12月20日 01:20:29582浏览

一、迷你MVC框架

1、Model.php

代码

  1. <?php
  2. //模型实现两个功能
  3. //1、连接数据库
  4. //2、定义获取数据的方法
  5. namespace mvc;
  6. use PDO;
  7. //1、创建类
  8. class Model
  9. {
  10. //2、添加类成员
  11. //2.1 添加类属性 数据库连接对象
  12. public $pdo;
  13. public function connect()
  14. {
  15. //配置数据库连接参数
  16. $dsn = 'mysql:host=localhost;dbname=edu';
  17. $username = 'root';
  18. $password = '111';
  19. //连接数据库
  20. $this->pdo = new PDO($dsn, $username, $password);
  21. }
  22. public function getData()
  23. {
  24. //首先连接数据库
  25. $this->connect();
  26. //从数据库拿到数据
  27. $data = $this->pdo->query('SELECT * FROM `student`')->fetchAll(PDO::FETCH_ASSOC);
  28. //返回数据
  29. return $data;
  30. }
  31. }

2、View.php

代码

  1. <?php
  2. //渲染数据
  3. namespace mvc;
  4. class View
  5. {
  6. //从数据库拿到的数据以参数的形式传给视图
  7. public function fetch($data)
  8. {
  9. $table = '<table>';
  10. $table .= '<caption>学生信息表</caption>';
  11. $table .= '<tr><th>ID</th><th>姓 名</th><th>性 别</th><th>年 龄</th><th>电 话</th>
  12. <th>邮 箱</th></tr>';
  13. foreach ($data as $student) {
  14. $table .= '<tr>';
  15. $table .= '<td>' . $student['id'] . '</td>';
  16. $table .= '<td>' . $student['name'] . '</td>';
  17. $table .= '<td>' . $student['sex'] . '</td>';
  18. $table .= '<td>' . $student['age'] . '</td>';
  19. $table .= '<td>' . $student['mobile'] . '</td>';
  20. $table .= '<td>' . $student['email'] . '</td>';
  21. $table .= '</tr>';
  22. }
  23. $table .= '</table>';
  24. //返回视图
  25. return $table;
  26. }
  27. }
  28. //模板简单样式:
  29. echo '<style>
  30. table {border-collapse: collapse; margin:auto; text-align:center;border: 1px solid; width: 600px;height: 260px}
  31. caption {font-size: 1.3rem; margin-bottom: 10px;}
  32. tr:first-of-type { background-color:lightblue;}
  33. td,th {border: 1px solid}
  34. td:first-of-type {text-align: center}
  35. </style>';

3、Controller.php

代码

  1. <?php
  2. // 控制器: 将学生信息表展示出来
  3. //增加服务层容器类
  4. // 使用Facade技术: 规范/统一了对外部对象的调用方式, 全部改为了静态调用, 不管之前的方法是什么类型
  5. namespace mvc;
  6. use Closure;
  7. // 1. 加载模型
  8. require 'Model.php';
  9. // 2. 加载视图
  10. require 'View.php';
  11. //添加服务容器层
  12. class Container
  13. {
  14. // 容器属性, 就是一个数组,里面全是创建对象的方法
  15. protected $instance = [];
  16. // 1. 放进去: 将类的实例化过程绑定到容器中
  17. // $alias: 类实例的别名,
  18. public function bind($alias, \Closure $process)
  19. {
  20. // 将类实例化的方法绑定/ 存储到服务容器中
  21. $this->instance[$alias] = $process;
  22. }
  23. // 2. 取出来: 执行容器中的实例方法
  24. public function make($alias, $params=[])
  25. {
  26. return call_user_func_array($this->instance[$alias], []);
  27. }
  28. }
  29. // 实例化容器
  30. $container = new Container();
  31. // 用到模型对象, 视图对象,将它们绑定到容器中
  32. $container->bind('model', function () {return new Model();});
  33. $container->bind('view', function () {return new View();});
  34. // 添加Facade门面类
  35. class Facade
  36. {
  37. //受保护的静态容器对象$container 和 提供给视图的数据$data = []
  38. protected static $container = null;
  39. protected static $data = [];
  40. // 用服务容器给它初始化
  41. public static function initialize(Container $container)
  42. {
  43. static::$container = $container;
  44. }
  45. // 用静态代理方式将模型中的getData()静态化
  46. public static function getData()
  47. {
  48. //make()是容器类Container中的方法,用其实例对象$container来调用
  49. //make()需要参数,是类的别名
  50. //make()传入的参数是model,那么生成的就是Model类的实例对象,因此可以调用Model类getData()
  51. //调用getData()获取的数据赋值给static::$data
  52. static::$data = static::$container->make('model')->getData();
  53. }
  54. // 用静态代理方式将视图中的fetch()静态化
  55. public static function fetch()
  56. {
  57. return static::$container->make('view')->fetch(static::$data);
  58. }
  59. }
  60. // 声明一学生类
  61. class Student extends Facade
  62. {
  63. //
  64. }
  65. // 3. 创建控制器
  66. class Controller
  67. {
  68. public function __construct(Container $container)
  69. {
  70. // 调用Faceda里面的初始化方法
  71. Student::initialize($container);
  72. }
  73. public function index()
  74. {
  75. // 3.1 获取数据
  76. Student::getData();
  77. // 3.2 渲染模板
  78. return Student::fetch();
  79. }
  80. }
  81. // 4. 客户端调用/访问类成员
  82. // 将模型对象与视图对象,以参数的方式再次注入到控制器的方法
  83. $controller = new Controller($container);
  84. //使用echo 输出视图,如果没有echo,前边再怎么正确也是白费功夫,浪费时间
  85. echo $controller->index();

4、结果

二、总结

1、对于MVC三者之间的分工的理解

Model:模型是关联数据表的,一个模型类绑定一个数据表,因此它是为视图提供获取数据的方法;
View:渲染数据,将控制器给的数据以什么样的形式展现给客户端;
Controller:获取数据,渲染模板;
但是对于三者的逻辑关系,把握还不够清晰,有时候分不清三者之间的界限。

2、容器类的使用

将类实例对象放进容器中,在需要的时候调取出来,取出来的时机需要仔细琢磨。

3、Facade门面类

Facade门面类可以简化类属性的访问方式,但是套马甲的原理还需要慢慢理解。

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