Blogger Information
Blog 23
fans 0
comment 0
visits 18971
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
MVC架构模式,依赖注入,对象容器与门面技术
手机用户1617360551
Original
472 people have browsed it

一 . 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);
Correcting teacher:PHPzPHPz

Correction status:qualified

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
Author's latest blog post