Blogger Information
Blog 53
fans 3
comment 0
visits 55252
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
12月7日-迷你MVC框架-***线上九期班
邯郸易住宋至刚
Original
578 people have browsed it

一、迷你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门面类可以简化类属性的访问方式,但是套马甲的原理还需要慢慢理解。

Correction status:Uncorrected

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