博客列表 >MVC架构模式,依赖注入,对象容器与门面技术

MVC架构模式,依赖注入,对象容器与门面技术

手机用户1617360551
手机用户1617360551原创
2021年08月24日 16:41:48470浏览

一 . MVC架构模式

MVC概念:MVC包括控制器(Controller),模型(Model),视图(View)。


模型的作用 : 获取数据并处理返回数据


视图的作用 :将取得的数据进行渲染


控制器的作用 : 调用模型和 视图,将模型产生的数据传递给视图,并让视图去显示 ,控制器层(中间层) 是协调视图与模型的中间桥梁.

视图类

  1. <?php
  2. namespace view_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>
  11. <th>职务</th><th>手机号</th><th>入职时间</th></tr>';
  12. foreach ($data as $staff) {
  13. $table.= '<tr>';
  14. $table.='<td>'.$staff['id'].'</td>';
  15. $table.='<td>'.$staff['name'].'</td>';
  16. $table.='<td>'.($staff['sex']?'男':'女').'</td>';
  17. $table.='<td>'.$staff['position'].'</td>';
  18. $table.='<td>'.$staff['mobile'].'</td>';
  19. $table.='<td>'.date('Y年m月d日',$staff['hiredate']).'</td>';
  20. $table.='</tr>';
  21. }
  22. $table.='</table>';
  23. return $table;
  24. }
  25. }
  26. echo '<style>
  27. table{
  28. border-collapse:collapse;
  29. border:1px solid;
  30. text-align:center;
  31. width:500px;
  32. height:150px;
  33. }
  34. caption{
  35. font-size:1.2rem;
  36. margin-bottom:10px;
  37. }
  38. tr:first-of-type{
  39. background-color:wheat;
  40. }
  41. td.th{
  42. border:1px solid;
  43. padding:5px;
  44. }
  45. </style>';
  46. require 'Model.php';
  47. // class Model
  48. // {
  49. // public function getData()
  50. // {
  51. // return (new \PDO('mysql:host=localhost;dbname=16','root','root'))
  52. // ->query('SELECT * FROM `staffs`')
  53. // ->fetchAll(\PDO::FETCH_ASSOC);
  54. // }
  55. // }
  56. (new \mvc_demo\model)->getData();
  57. //echo (new View)->fetch();

模型类

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

操作器类

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

二.依赖注入 依赖注入为了防止当前类对外部了的过分依赖,而通过构造方法来实现自动注入;

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

三.对象容器 Container

对象容器可以理解为一个自动生产类的工厂

对象容器中有两个方法: bind方法和mark方法

bind方法就是将对象容器中添加一个实例

mark方法就是从容器中取出一个类实例(new)

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

四.门面技术 Facades

在 Laravel 应用中,Facade 就是一个可以从容器访问对象的类。其中核心的部件就是 Facade 类。

Facede门面技术:可以接管对容器中对象的访问,实现模型成员和视图成员的静态化

  1. <?php
  2. namespace mvc_demo;
  3. //加载模型类
  4. require 'Model.php';
  5. //加载视图类
  6. require 'View.php';
  7. //服务容器
  8. class Container2
  9. {
  10. //对象容器
  11. protected $instances = [];
  12. //bind:将对象容器中添加一个实例
  13. public function bind($alias,\Closure $process)
  14. {
  15. $this->instances[$alias] = $process;
  16. }
  17. //make:从容器中取出一个类实例(new)
  18. public function mark($alias,$params = [])
  19. {
  20. return call_user_func_array($this->instances[$alias],[]);
  21. }
  22. }
  23. $container = new Container2;
  24. $container->bind('model',function(){return new Model;});
  25. $container->bind('view',function(){return new View;});
  26. //Facede[]门面技术:可以接管对容器中对象的访问
  27. class Facede
  28. {
  29. //容器实例属性
  30. protected static $container = null;
  31. //初始化方法:从外部接收一个依赖对象:服务容器的实例
  32. public static function initialize(Container2 $container)
  33. {
  34. static::$container = $container;
  35. }
  36. }
  37. //模型成员静态化
  38. class Model extends Facede
  39. {
  40. protected static $data = [];
  41. public static function getData()
  42. {
  43. static::$data = static::$container->mark('model')->getData();
  44. }
  45. }
  46. //视图成员静态化
  47. class View extends Facede
  48. {
  49. protected static $data = [];
  50. public static function fetch()
  51. {
  52. static::$data = static::$container->mark('view')->fetch($data);
  53. }
  54. }
  55. //////////////////////////////////////////////////////////////////////////////////////
  56. //创建控制器
  57. class Controller5
  58. {
  59. //构造方法:调用门面的初始化方法
  60. public function __construct(Container2 $container)
  61. {
  62. Facede::initialize($container);
  63. }
  64. public function index(Container2 $container)
  65. {
  66. //1.获取数据
  67. $data = Model::getData();
  68. //2.渲染视图
  69. return View::fetch($data);
  70. }
  71. }
  72. //客户端
  73. //实例化控制类
  74. $controller = new Controller5($container);
  75. echo $controller->index($container);
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议