博客列表 >MVC框架(依赖注入、对象容器)

MVC框架(依赖注入、对象容器)

赵大叔
赵大叔原创
2020年05月14日 23:11:19575浏览

MVC框架

  • Model:模型类,数据库操作
  • View:视图类,展示到客户端
  • Controller:控制器
  • 依赖注入:在客户端实例化类,把对象当做参数注入调用方法
  • 容器:对象容器,对象管家

Model代码:

  1. <?php
  2. namespace mvc_demo;
  3. // Model 模型类: 用于数据库操作
  4. class Model
  5. {
  6. public function getData()
  7. {
  8. return (new \PDO('mysql:host=localhost;dbname=phpedu', 'root','root'))
  9. ->query('SELECT * FROM `salary` LIMIT 15')
  10. ->fetchAll(\PDO::FETCH_ASSOC);
  11. }
  12. }

View代码:

  1. <?php
  2. namespace mvc_demo;
  3. // 视图类
  4. class View
  5. {
  6. public function fetch($data)
  7. {
  8. $table = '<table>';
  9. $table .= '<caption>员工工资明细</caption>';
  10. $table .= '<tr><th>ID</th><th>工号</th><th>姓名</th><th>入职日期</th><th>部门</th><th>岗位</th><th>工作天</th><th>应发</th></tr>';
  11. // 将数据循环遍历出来
  12. foreach ($data as $salary) {
  13. $table .= '<tr>';
  14. $table .= '<td>' . $salary['id'] .'</td>';
  15. $table .= '<td>' . $salary['msnv'] .'</td>';
  16. $table .= '<td>' . $salary['name'] .'</td>';
  17. $table .= '<td>' . date('Y-m-d', $salary['hiredate']) . '</td>';
  18. $table .= '<td>' . $salary['donvi'] . '</td>';
  19. $table .= '<td>' . $salary['congviec'] . '</td>';
  20. $table .= '<td>' . $salary['ngaycong'] . '</td>';
  21. $table .= '<td>' . $salary['salary'] . '</td>';
  22. $table .= '</tr>';
  23. }
  24. $table .= '</table>';
  25. return $table;
  26. }
  27. }
  28. echo '<style>
  29. table {border-collapse: collapse; border: 1px solid;text-align: center; margin: auto;}
  30. caption {font-size: 1.2rem; margin-bottom: 10px;}
  31. tr:first-of-type { background-color:wheat;}
  32. td,th {border: 1px solid; padding:5px}
  33. </style>';

控制器一(普通注入):

  1. <?php
  2. namespace mvc_demo;
  3. // 控制器2
  4. // 1. 加载模型类
  5. require 'Model.php';
  6. // 2. 加载视图
  7. require 'View.php';
  8. // 3. 创建控制
  9. class Controller2
  10. {
  11. public function index(Model $model, View $view)
  12. {
  13. // 1. 获取数据
  14. $data = $model->getData();
  15. // 2. 渲染模板/视图
  16. return $view->fetch($data);
  17. }
  18. }
  19. // 客户端:
  20. $model = new Model;
  21. $view = new View;
  22. // 实例化控制器类
  23. $controller = new Controller2;
  24. echo $controller->index($model, $view);

控制器二(构造方法注入):

  1. <?php
  2. namespace mvc_demo;
  3. // 控制器3
  4. // 1. 加载模型类
  5. require 'Model.php';
  6. // 2. 加载视图
  7. require 'View.php';
  8. // 3. 创建控制
  9. class Controller3
  10. {
  11. // 依赖对象属性: 对象参数
  12. private $model;
  13. private $view;
  14. public function __construct(Model $model, View $view)
  15. {
  16. $this->model = $model;
  17. $this->view = $view;
  18. }
  19. public function index()
  20. {
  21. // 1. 获取数据
  22. $data = $this->model->getData();
  23. // 2. 渲染模板/视图
  24. return $this->view->fetch($data);
  25. }
  26. public function index1()
  27. {
  28. // 1. 获取数据
  29. $data = $this->model->getData();
  30. // 2. 渲染模板/视图
  31. return $this->view->fetch($data);
  32. }
  33. }
  34. // 客户端:
  35. $model = new Model;
  36. $view = new View;
  37. // 实例化控制器类
  38. $controller = new Controller3($model, $view);
  39. echo $controller->index1();

控制器三(对象容器):

  1. <?php
  2. namespace mvc_demo;
  3. // 控制器4
  4. // 1. 加载模型类
  5. require 'Model.php';
  6. // 2. 加载视图
  7. require 'View.php';
  8. // 3. 服务容器
  9. class Container1
  10. {
  11. // 对象容器
  12. protected $instances = [];
  13. // 绑定: 向对象容器中添加一个类实例
  14. public function bind($alias, \Closure $process)
  15. {
  16. $this->instances[$alias] = $process;
  17. }
  18. // 取出: 从容器中取出一个类实例 (new)
  19. public function make($alias, $params = [])
  20. {
  21. return call_user_func_array($this->instances[$alias], []);
  22. }
  23. }
  24. $container = new Container1;
  25. // 绑定
  26. $container->bind('model', function () {return new Model;});
  27. $container->bind('view', function () {return new View;});
  28. // 4. 创建控制
  29. class Controller4
  30. {
  31. public function index(Container1 $container)
  32. {
  33. // 1. 获取数据
  34. $data = $container->make('model')->getData();
  35. // 2. 渲染模板/视图
  36. return $container->make('view')->fetch($data);
  37. }
  38. }
  39. // 客户端:
  40. // 实例化控制器类
  41. $controller = new Controller4();
  42. echo $controller->index($container);

感觉越来越抽象,对象容器知识还有点模糊,还要再多看几遍。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议