Blogger Information
Blog 36
fans 1
comment 0
visits 29736
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
mvc外部注入与服务容器
Jason
Original
586 people have browsed it

mvc控制器外部注入

依赖外部注入听起来有点高大上,但是可以通过简单的案例,与看文档消化掉,我的理解就是,当A类需要依赖与B类,也就是需要在A类中实例化B类的对象来使用的时候,如果B类中的功能发生改变,也会导致A类中使用B类的地方也要跟着修改,导致A类与B类高耦合。A类应该去依赖B类的接口,把具体的类的实例化交给外部

方法一:通过参数,将对象传递到方法中
案例:

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

输出:

  1. 员工信息
  2. 1 100 100 1564 12333333 北京市
  3. 2 100 66 1234 15555555 广州市
  4. 3 王麻子 77 123 1666666 上海市
  5. 4 1 1 1 1 1
  6. 6 3 3 3 3 3

方法二:通过构造类的构造方法,将对象传递过去使用
案例

  1. namespace mvc_demo;
  2. // 控制器
  3. // 1.加载模型
  4. require 'Model.php';
  5. // 2.加载试图
  6. require 'View.php';
  7. // 3创建控制
  8. class Controller3
  9. {
  10. private $model;
  11. private $view;
  12. 注入到控制器的构造方法中
  13. public function __construct(Model $model,View $view)
  14. {
  15. $this->model = $model;
  16. $this->view = $view;
  17. }
  18. public function index()
  19. {
  20. // 获取数据
  21. $data = $this->model->getData();
  22. // 加载视图
  23. return $this->view->fetch($data);
  24. }
  25. public function index3()
  26. {
  27. // 获取数据
  28. $data = $this->model->getData();
  29. // 加载视图
  30. return $this->view->fetch($data);
  31. }
  32. // public function index4(Model $model, View $view)
  33. // {
  34. // // 获取数据
  35. // $data = $model->getData();
  36. // // 加载视图
  37. // return $view->fetch($data);
  38. // }
  39. }
  40. $model = new Model;
  41. $view = new View;
  42. $controller = new Controller3($model,$view);
  43. // 通过注入的方式,将需要的对象传递给控制器
  44. echo $controller->index();

输出:

  1. 员工信息
  2. 1 100 100 1564 12333333 北京市
  3. 2 100 66 1234 15555555 广州市
  4. 3 王麻子 77 123 1666666 上海市
  5. 4 1 1 1 1 1
  6. 6 3 3 3 3 3

服务容器类与对象销毁方法

服务容器,就是将我们要用到的类对象,放到一个容器里面,在外部调用的时候就不要重新new一个对象,这样代码的瞬间就高大上了,只用几行代码就调用了index方法,写法很好

  1. namespace mvc_demo;
  2. require 'Model.php';
  3. require 'View.php';
  4. class Container1
  5. {
  6. // 对象容器
  7. protected $box = [];
  8. // 绑定:向对象容器中添加一个类实例
  9. public function bind($alias, \Closure $process)
  10. {
  11. $this->box[$alias] = $process;
  12. }
  13. // 取出:从容器中取出一个类实例(new)
  14. public function make($alias,$params = [])
  15. {
  16. return call_user_func($this->box[$alias],[]);
  17. }
  18. }
  19. $container = new Container1;
  20. // 绑定
  21. $container->bind('model',function() {return new Model;});
  22. $container->bind('view',function() {return new View;});
  23. class Controller4
  24. {
  25. public function index(Container1 $container)
  26. {
  27. // 获取数据
  28. $data = $container->make('model')->getData();
  29. // 渲染模板
  30. return $container->make('view')->fetch($data);
  31. }
  32. }
  33. $controller = new Controller4();
  34. echo $controller->index($container);
  35. // 对象销毁方法
  36. unset($controller);

输出:

  1. 员工信息
  2. 1 100 100 1564 12333333 北京市
  3. 2 100 66 1234 15555555 广州市
  4. 3 王麻子 77 123 1666666 上海市
  5. 4 1 1 1 1 1
  6. 6 3 3 3 3 3

总结

  • 依赖注入技术很好的解决了,对象的耦合问题,这样修改的时候就不用,牵一发而动全身,代码的可维护性就上去了,基本原理算是掌握了,还需要在实战中更多的运用,才可以运用自如。
  • 服务容器技术,将我们要用到的对象,用个容器装起来,外部调用的时候不用new一个了

学了这两个技术,感觉离php又近了一步,虽然只是很小的进步,但累积起来也是很大的进步。

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:你的理解是对的, 如果将这二个技术的全程展现, 估计大家全看晕, 但我用了最简单的方式讲给大家, 也是希望大家能理解这里面是怎么回事, 如果有3-5年编程经验的是秒懂, 如果是初学者, 还是要花点时间和精力的
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