博客列表 >静态类方法与MVC设计模式的依赖注入方法,容器绑定与Facade门面 - 第九期线上班 20191206

静态类方法与MVC设计模式的依赖注入方法,容器绑定与Facade门面 - 第九期线上班 20191206

MArtian
MArtian原创
2019年12月06日 17:20:17946浏览

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();

该设计模式思路

  1. 首先加载modelview类,然后创建容器,先创建一个instance属性,用来存储类与类的实例化方法,在容器中创建绑定类与实例化方法bind,再创建一个回调类的方法make,在调用该方法时返回一个绑定类的实例。

  2. 将容器实例化,命名为$container,然后将要绑定的类和实例化方法通过bind方法存储到instance属性中。

  3. 创建Facade门面类,创建两个属性,一个用来接收实例化后的容器$cotainer,一个用来存储数据$data,然后创建初始化方法,将实例化后的容器类$container赋值给Facade $container属性,方便调用。

  4. 创建getData()静态方法,使用实例化容器$container访问make方法,将类名model传入,再访问model类中的->getData()方法,获取到数据,并存储到$data属性中。

  5. 创建fetchView()静态方法,使用实例化容器$container访问make方法,将类名view传入,在访问view类中的->fetchView()方法,将刚刚$data传入,并返回渲染后的数据。

  6. 创建控制器controller类,并设置构造方法,将实例化容器$container传入,然后用静态类Facade::initialize()传入$container容器实例,实现初始化

  7. 在控制器中创建index()方法,访问Facade::getData()方法获取数据,然后再return Facade::fetchView()访问渲染方法,并返回,这里并不需要输入数据了,因为Facade门面类中已经全部执行完毕了。

1.jpg2.jpg3.jpg

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