博客列表 >TP5依赖注入_容器_Facade门面以及路由_2018年8月22日

TP5依赖注入_容器_Facade门面以及路由_2018年8月22日

宋超的博客
宋超的博客原创
2018年10月27日 16:54:361827浏览

1.依赖注入实例

<?php
/**
 * 依赖注入   把对象通过参数传递给类
 */
//加载M模型类
require_once 'Model.php';
//加载V视图类
require_once 'View.php';
// 控制器C
class Controller
{
    public function index(Model $model,View $view) //依赖注入
    {
        //获取数据
//
        $data = $model->getData(); // 获取成绩表中的数据
        //渲染模板
//
        return $view->fetch($data); //渲染视图展示数据
    }
}
$model = new Model();  //实例化模型类
$view = new View; //实例化视图类
$controller = new Controller(); //实例化控制器类
print_r($controller->index($model,$view)); //调用控制器中的index()操作,完成模型选择与模板输出


<?php
/**
 * 依赖注入   通过构造器的方式来进行
 */
//加载M模型类
require_once 'Model.php';
//加载V视图类
require_once 'View.php';
// 控制器C
class Controller
{
    protected $model = null;
    protected $view = null;
    //构造方法注入
    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); //渲染视图展示数据
    }
}
$model = new Model();  //实例化模型类
$view = new View; //实例化视图类
$controller = new Controller($model, $view); //实例化控制器类
print_r($controller->index()); //调用控制器中的index()操作,完成模型选择与模板输出

运行实例 »

点击 "运行实例" 按钮查看在线实例


2.使用容器Container实例

<?php
/**
 *使用容器处理数据
 */
//加载Model类
require_once 'Model.php';
//加载视图类
require_once 'View.php';

//创建容器类
class Container
{
//    创建容器属性,保存类实例化的方法
    protected $instance = [];

    //$alias:类的实例别名,$process:类的实例化过程/函数/Closure闭包类型
    public function bind($alias, Closure $process)
    {
//        将类实例方法放入容器中
        $this->instance[$alias] = $process;

    }
    //创建类的实例,执行容器中的类实例方法 $alias参数是容器中的类实例别名
    public function make($alias, $param=[])
    {
        //通过执行回调来输入结果
        return call_user_func_array($this->instance[$alias],[]);

    }

}
//控制器
class Controller{
    public function index(Container $container)
    {
        //获取数据,窗口对象的make方法
        $data = $container->make('model')->getData();

        //渲染数据
        return $container->make('view')->fetch($data);
    }
}
//将要用到的类实例Model/View绑定到容器中
$container = new Container(); //实例化容器
//将Model类实例方法绑定到容器中,标识为model
$container->bind('model',function(){return new Model();});
//同上将View类实例方法绑定到容器中,标签为view
$container->bind('view',function(){return new View();});

$controller = new Controller();
echo $controller->index($container);

运行实例 »

点击 "运行实例" 按钮查看在线实例


3.Facade门面实例

<?php
/**
 * Facade 门面模式又叫外观模式,它可以使用容器中的成员,对外提供一个统一的访问接口。
 * 其实就是给容器中的成员,提供一个静态代码,以静态语法来统一对容器成员进行访问 *
 */

require "Model.php";
require "View.php";


//创建容器类,容器中可以保存很多类型
class Container
{
    //创建容器属性,保存着类实例的创建方法
    protected $instance = [];

    //$alias:类实例别名,  $process:类的实例化过程/函数/Closure闭包类型
    public function bind($alias, Closure $process)
    {
        //将类实例方法存入到容器中
        $this->instance[$alias] = $process;
    }

    //创建类的实例 执行容器中的类实例方法,$alias参数是容器中的类实例别名
    public function make($alias, $params=[])
    {
        return call_user_func_array($this->instance[$alias],[]);
    }
}

//将要用到的类实全(MOdel/View)绑定到容器中
$container = new Container();
//将Model类实例方法绑定到容器中,标识model
$container->bind('model',function(){return new Model();});
//将View类实例方法绑定到容器中,标识view
$container->bind('view',function(){return new View();});

//声明facade类,接管对容器实例方法调用
class Facade
{
    //控制器中调用到了Model类中的getData()方法,View类中的view()方法;
    //为这两个访问创建一个统一访问的静态接口
    //调用方法使用的关键字static:可以实现在静态继承上下文环境中,实现静态成员调用者的动态设置
    //后台的Article 就是Facade类的子类,如果不使用static::就无法动态调用子类中的成员
    //如果用不到子类,这里可以不用static后台静态绑定,可以使用self::代替
    //但使用static,会使代码更具健壮性,实用性

    protected static $container = null;
    protected static $data = [];


    public static function initialize(Container $container)
    {
        static::$container = $container;// 使用static:: 是后期静态绑定的语法
    }

    //设置获取数据的静态***方法:getData()  static::$container是引用类Model的实例
    public static function getData()
    {
        static::$data = static::$container->make('model')->getData();
    }
    //渲染数据使用fetch()
    public static function fetch()
    {
        //static::$container 是当前引用类‘View’的实例
        return static::$container->make('view')->fetch(static::$data);
    }
}

//声明一个内容类
class Article extends Facade
{

}
//控制器
class Controller
{
    //在构造方法中调用Facade初始化方式,完成容器的实例化:依赖注入
    public function __construct(Container $container)
    {
        Article::initialize($container);
    }
    //将容器对象注入到控制器方法中
    public function index()
    {
        Article::getData();//获取数据
        return Article::fetch(); //渲染模板
    }
}
//***端调用
$controller = new Controller($container);
echo $controller->index();

运行实例 »

点击 "运行实例" 按钮查看在线实例

4.路由实现前面URL和程序对应

<?php
//获取当前请求的URL地址
//http://tp5.io/route.php/admin/index/hello/id/10/name/xiaopi
$uri = $_SERVER['REQUEST_URI'];
//exit($uri);
//用目录分隔符,解析出URL中的各个部分,DIRECTORY_SEPARATOR是系统分隔符常量
//windows:反斜线'\',linux:正斜线'/'
//echo(DIRECTORY_SEPARATOR);
$req = explode('/',$uri);
echo '<pre>'.print_r($req,true);

$route = array_slice($req,2,3);
echo '<pre>' . print_r($route,true);

list($module, $controller, $action) = $route;
//echo "模块:{$module}<br>控制器:{$controller}<br>操作:{$action}<br>";

$pathinfo['module'] = $module;
$pathinfo['controller'] = $controller;
$pathinfo['action'] = $action;

//echo '<pre>' . print_r($pathinfo,true);

//从pathinfo数组解析出:参数键值对
$values = array_slice($req, 5,6);

echo count($values);

for($i=0;$i<count($values);$i+=2){
  $params[$values[$i]] = $values[$i+1];  
}

//查询解析出来的参数

echo '<pre>' . print_r($params,true);


class Index
{
   public function __construct($pathinfo)
   {
       $this->pathinfo = $pathinfo;
   }
   public function hello2($id,$name,$age)
   {
       return "{$this->pathinfo['module']}模块{$this->pathinfo['controller']}控制器".$this->pathinfo['action']."操作:id={$id},name={$name},age={$age}";
   }
}

echo call_user_func_array([(new index($pathinfo)), $pathinfo['action']], $params);


Model文件

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/10/25
 * Time: 14:52:45
 */
require_once 'lib/Db.php';
//模型类:用户于数据库操作
class Model
{
    public function getData()
    {
        $db = new Db();
        $res = $db->table('article')->field('id,cid,title,keywords')->lists();
        return $res;
    }

}

运行实例 »

点击 "运行实例" 按钮查看在线实例


View文件

<?php
/**
 *视图类:渲染数据
 */

class View
{
    public function fetch($data)
    {
     $html = '<table border="1" cellspacing="0" cellpadding="0" width="700" style="text-indent:1rem;line-height: 35px;">';
     $html .= '<caption>文章列表</caption>';
     $html .= '<tr bgcolor="#cfcfcf"><th>ID</th><th>CID</th><th>标题</th><th>关键词</th></tr>';
        foreach ($data as $value)
        {
            $html .= '<tr>';
            $html .= '<td>' . $value['id'] . '</td>';
            $html .= '<td>' . $value['cid'] . '</td>';
            $html .= '<td>' . $value['title'] . '</td>';
            $html .= '<td>' . $value['keywords'] . '</td>';
            $html .= '</tr>';        }
        $html .= '</table>';
        return $html;
    }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例


实例1-3的效果图

360截图20181027164301843.jpg

实例4

360截图20181027165330339.jpg


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