Blogger Information
Blog 36
fans 1
comment 0
visits 32432
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
TP5依赖注入_容器_Facade门面以及路由_2018年8月22日
宋超的博客
Original
1831 people have browsed it

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


Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post