mvc控制器外部注入
依赖外部注入听起来有点高大上,但是可以通过简单的案例,与看文档消化掉,我的理解就是,当A类需要依赖与B类,也就是需要在A类中实例化B类的对象来使用的时候,如果B类中的功能发生改变,也会导致A类中使用B类的地方也要跟着修改,导致A类与B类高耦合。A类应该去依赖B类的接口,把具体的类的实例化交给外部
方法一:通过参数,将对象传递到方法中
案例:
<?php
namespace mvc_demo;
// 控制器
// 1.加载模型
require 'Model.php';
// 2.加载试图
require 'View.php';
// 3创建控制
class Controller3
{
private $model;
private $view;
public function index4(Model $model, View $view)
{
// 获取数据
$data = $model->getData();
// 加载视图
return $view->fetch($data);
}
}
$model = new Model;
$view = new View;
$controller = new Controller3();
echo $controller -> index4($model, $view);
输出:
员工信息
1 100 100 1564 12333333 北京市
2 100 66 1234 15555555 广州市
3 王麻子 77 123 1666666 上海市
4 1 1 1 1 1
6 3 3 3 3 3
方法二:通过构造类的构造方法,将对象传递过去使用
案例
namespace mvc_demo;
// 控制器
// 1.加载模型
require 'Model.php';
// 2.加载试图
require 'View.php';
// 3创建控制
class Controller3
{
private $model;
private $view;
注入到控制器的构造方法中
public function __construct(Model $model,View $view)
{
$this->model = $model;
$this->view = $view;
}
public function index()
{
// 获取数据
$data = $this->model->getData();
// 加载视图
return $this->view->fetch($data);
}
public function index3()
{
// 获取数据
$data = $this->model->getData();
// 加载视图
return $this->view->fetch($data);
}
// public function index4(Model $model, View $view)
// {
// // 获取数据
// $data = $model->getData();
// // 加载视图
// return $view->fetch($data);
// }
}
$model = new Model;
$view = new View;
$controller = new Controller3($model,$view);
// 通过注入的方式,将需要的对象传递给控制器
echo $controller->index();
输出:
员工信息
1 100 100 1564 12333333 北京市
2 100 66 1234 15555555 广州市
3 王麻子 77 123 1666666 上海市
4 1 1 1 1 1
6 3 3 3 3 3
服务容器类与对象销毁方法
服务容器,就是将我们要用到的类对象,放到一个容器里面,在外部调用的时候就不要重新new一个对象,这样代码的瞬间就高大上了,只用几行代码就调用了index
方法,写法很好
namespace mvc_demo;
require 'Model.php';
require 'View.php';
class Container1
{
// 对象容器
protected $box = [];
// 绑定:向对象容器中添加一个类实例
public function bind($alias, \Closure $process)
{
$this->box[$alias] = $process;
}
// 取出:从容器中取出一个类实例(new)
public function make($alias,$params = [])
{
return call_user_func($this->box[$alias],[]);
}
}
$container = new Container1;
// 绑定
$container->bind('model',function() {return new Model;});
$container->bind('view',function() {return new View;});
class Controller4
{
public function index(Container1 $container)
{
// 获取数据
$data = $container->make('model')->getData();
// 渲染模板
return $container->make('view')->fetch($data);
}
}
$controller = new Controller4();
echo $controller->index($container);
// 对象销毁方法
unset($controller);
输出:
员工信息
1 100 100 1564 12333333 北京市
2 100 66 1234 15555555 广州市
3 王麻子 77 123 1666666 上海市
4 1 1 1 1 1
6 3 3 3 3 3
总结
- 依赖注入技术很好的解决了,对象的耦合问题,这样修改的时候就不用,牵一发而动全身,代码的可维护性就上去了,基本原理算是掌握了,还需要在实战中更多的运用,才可以运用自如。
- 服务容器技术,将我们要用到的对象,用个容器装起来,外部调用的时候不用new一个了
学了这两个技术,感觉离php
又近了一步,虽然只是很小的进步,但累积起来也是很大的进步。
Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:你的理解是对的, 如果将这二个技术的全程展现, 估计大家全看晕, 但我用了最简单的方式讲给大家, 也是希望大家能理解这里面是怎么回事, 如果有3-5年编程经验的是秒懂, 如果是初学者, 还是要花点时间和精力的