博客列表 >mvc外部注入与服务容器

mvc外部注入与服务容器

Jason
Jason原创
2020年05月17日 17:31:12587浏览

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又近了一步,虽然只是很小的进步,但累积起来也是很大的进步。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议