MVC依赖注入模式,Facade门面调用与创建容器类中的方法
<?phpnamespace _newMVC;// 加载模型require 'model.php';// 加载视图require 'view.php';// 创建容器class Container{ // 创建存储数组,用于存储类名与类实例化的方法 protected $instance = []; // 创建绑定方法,用于接收绑定类,和实例化的方法 public function bind($alias,\Closure $process){ $this->instance[$alias] = $process; // 接收要绑定的类与实例化方法存储到$instance,键名为类名,$process存储的实例化方法 } // 创建生成类方法,参数为类名,返回调用函数,就是调用了$instance存储的[类] 和 实例化方法 public function make($alias,$params=[]){ return call_user_func_array($this->instance[$alias],[]); }}// 实例化容器,并将MODEL和VIEW类实例化方法,存储到container类的$instance属性中$container = new Container();$container -> bind('model',function(){return new model;}); // model类与实例化方法$container -> bind('view',function(){return new view;}); // view类与实例化方法class Facade{ protected static $container = null; //接收实例化后的类 protected static $data = []; // 数据存储// 初始化容器,将Facade内的$container赋值,获得实例化后的$container容器变量,方便调用$container类中方法. public static function initialize($container){ static :: $container = $container; }// 获取数据,使用静态$container属性调用$container容器类中$instance存储的实例 model,中getData方法 public static function getData(){ static :: $data = static :: $container -> make('model') -> getData(); }// 渲染数据,使用静态$container调用$container容器类中$instance存储的实例 view,中fetchView方法渲染静态属性 $data获取的数据 public static function fetchView(){ return static :: $container -> make('view') -> fetchView(static :: $data); }}//创建控制器class Controller{//初始化控制器,将实例化的$container变量传入,然后调用Facade静态类中的initialize方法,将容器准备好 public function __construct(Container $container) { Facade :: initialize($container); } public function index(){// 使用 Facade静态方法 getData 调用model实例中getData方法,获取数据 Facade :: getData();// 使用 Facade静态方法 fetchView 调用view实例中fetchView方法,渲染getData获取到的数据 return Facade :: fetchView(); }}$controller = new Controller($container);echo $controller -> index();
该设计模式思路
首先加载
model
和view
类,然后创建容器,先创建一个instance
属性,用来存储类与类的实例化方法,在容器中创建绑定类与实例化方法bind
,再创建一个回调类的方法make
,在调用该方法时返回一个绑定类的实例。将容器实例化,命名为
$container
,然后将要绑定的类和实例化方法通过bind
方法存储到instance
属性中。创建
Facade
门面类,创建两个属性,一个用来接收实例化后的容器$cotainer
,一个用来存储数据$data
,然后创建初始化方法,将实例化后的容器类$container
赋值给Facade $container
属性,方便调用。创建
getData()
静态方法,使用实例化容器$container
访问make
方法,将类名model
传入,再访问model
类中的->getData()
方法,获取到数据,并存储到$data
属性中。创建
fetchView()
静态方法,使用实例化容器$container
访问make
方法,将类名view
传入,在访问view
类中的->fetchView()
方法,将刚刚$data
传入,并返回渲染后的数据。创建控制器
controller
类,并设置构造方法,将实例化容器$container
传入,然后用静态类Facade::initialize()
传入$container
容器实例,实现初始化在控制器中创建
index()
方法,访问Facade::getData()
方法获取数据,然后再return Facade::fetchView()
访问渲染方法,并返回,这里并不需要输入数据了,因为Facade
门面类中已经全部执行完毕了。