博客列表 >1011 容器注入 mvc结构 路由分拆

1011 容器注入 mvc结构 路由分拆

没有人的夏天的博客
没有人的夏天的博客原创
2019年10月17日 16:05:42582浏览
  • 容器注入:  // 容器,和 facade 门面 都是类,用于分配参数和方法,放在controller中,调用model和向view返回数据

      •    // 容器用来存放 调用过程, //门面是用 静态方法 向容器内传递 参数, 减少 new,

      •    // 容器是用于存放对象创建方法的类,用于管理对象,门面是指容器的静态调用注入方案,

      • 实例如下:  用闭包函数设计对象创建过程, 

      • // 自行设计 用方法 设计 对象创建过程 在数组赋值后 调用失败

      • // 直接make 中提供new 变量 尝试成功   不需要bind 方法,直接传递 new类和参数

      •         $a = __NAMESPACE__ . '\\' .$name;  需要加入空间名称才可以new成功

      •         return call_user_func_array([(new $a()),$b], [$arguments]);}

  • mvc结构 : // view 向controlle发送指令和参数, controller判断参数 指向,调用 modle方法,并传递参数

        • // model 处理参数,整理正确的参数 并返回相关数据和信息 给controller

        • // controller 获取信息后 向view中传递数据

        • 实例如下: 电影信息列表   mvc的分离设计

  • 路由分拆:是对url地址进行分拆到数组,获取相关数据的过程,主要使用以下三个函数                         

                            $_SERVER['REQUEST_URI'] 获取url函数                            

                            explode() 字符串分割,根据符号分割字符串到数组中

                            array_slice()数组分离,根据位置分离部分数组内容

                            实例如下:有get传值的url 地址分拆


容器注入实例

// 容器,创建一个数组,将对象的创建 对应到相关的 键与值中 并将对象返回
class container1011
{   
    public $classarr = []; // 给定一个类数组,存放类对象
    public function bind($name, Closure $process)  // 给外部调用使用, 绑定一个对象到对象数组中,closure 指定参数为函数类别
    { 
        $this->classarr[$name] = $process;
    }    
    public function make($name, $arguments = []) // 返回一个 先bind 过的对象 到调用者;
    {
        return call_user_func_array($this->classarr[$name], []);
    }
}
$container = new Container1011();  // 设计model和view对象创建方法 用于注入
$container->bind('Dbop', function () { return new Dbop();});  // 将模型model类的对象创建方法绑定到容器中, 起一个别名: Dbop
$container->bind('view', function () { return new View();});  // 将视图绑定到容器中, 起一个别名: view

一个简单的mvc结构实例

效果图:

TIM截图20191017131136.png

controller.php 代码实例

<?php
namespace _101101;
include '../model/1011mvc_model.php';  // 控制器中 加载model方法库
include '../view/1011mvc_view.php';  // 控制器中 加载view方法 显示数据
interface idb_conf  // 定义一个 公共配置 信息 接口
{
    const DNS = 'mysql:host=127.0.0.1;dbname=app.io';
    const USER = 'root';
    const PASSWORD = 'root123456';
}

// 以下是 controller 控制器,负责控制调用 model 和向view 返回数据

class container1011  // 容器
{
    public $classarr = [];      // 对象数组
    public function bind($name, Closure $process)   // 给外部调用使用,绑定一个对象到对象数组中的方法
    {
        $this->classarr[$name] = $process;
    }
        public function make($name, $arguments = [])  // 返回一个 先bind 过的对象 到调用者的方法
    {
        return call_user_func_array($this->classarr[$name], []);
    }
}
$container = new Container1011();  //  创建容器
$container->bind('Dbop', function () { return new Dbop(); });  // 将模型model对象创建方法绑定到容器中, 起一个别名: Dbop
$container->bind('view', function () { return new View(); });  // 将视图绑定到容器中, 起一个别名: view

class controller  //控制器类
{   
    public function run($container, $param)   // 调用方法定义
    {
        $a = $param['action'];  // 获取 动作方法参数
        $data = $container->make('Dbop')->$a($param);  // 调用容器内创建的model对象,并向对象内的方法传递参数,及获取返回值
        return $container->make('view')->display($data); //调用容器内创建的view对象,并向对象内的方法传递参数
    }   
}
// 位置及按钮提供的 get 或 post 数组参数,
$param = [
    'table' => 'movies', //当面位置的指定表
    'action' => 'find', // 方法
    'where' => '', //条件
    'field' => '*' // 字段
]; 
$a = new controller();  // 创建控制器
echo $a->run($container, $param); // 运行相关方法


model.php 代码实例

<?php 
namespace _101101;  // model 方法库, 调用获取数据的方法
class new_pdo implements idb_conf  // newpdo 方法
{    
    protected static $pdo = '';  // PDO 连接方法
    public static function linkdb()   // 类中的静态属性赋值 为 pod 对象,连接接口中的常量值
    {      
        return self::$pdo = new \PDO(idb_conf::DNS, idb_conf::USER, idb_conf::PASSWORD);  
    }

interface idbinfo_fanu  // 定义一个数据库操作 接口
{
    public function table($tablename);
    public function field($fieldname);
    public function where($wherename);
    public function limit($limitname);
    public function orderby($orderbyname);
    public function select();
    public function insert($name,$data);
    public function update($name);
    public function delete($name);
}

class Dbinfo implements idbinfo_fanu  // 定义数据操作方法,从属 接口 idbinfo_fanu  
{   
    public function table($tablename) //设置表名方法 // 给table属性赋值 // 返回对象
    {      
        $this->table = $tablename;   
        return $this;  
    }  
    public function field($fieldname)  //设置字段名方法 // 给field属性赋值,没有传值为空,有传值进行赋值 // 返回对象
    {
        $this->field = empty($fieldname) ? '*' : $fieldname;    
        return $this;
    }    
    public function where($wherename) //设置条件方法 // 给where属性赋值,没有传值为空,有传值进行赋值// 返回对象
    {       
        $this->where = empty($fieldname) ? '' : ' WHERE ' . $wherename;       
        return $this;
    } 
    public function limit($limitname) //设置数量方法// 给limit属性赋值,没有传值为空,有传值进行赋值 // 返回对象
    {   
        $this->limit = empty($fieldname) ? '' : ' LIMIT ' . $limitname;     
        return $this;
    }

    public function orderby($orderbyname) //设置排序方法// 给orderby属性赋值,没有传值为空,有传值进行赋值//返回对象
    {        
        $this->orderby = empty($fieldname) ? '' : ' ORDER BY ' . $orderbyname;
        return $this;
    }  
    public function select()    //设置 查询 mysql语句拼接
    {        
        $sql = 'SELECT '. $this->field . ' FROM ' . $this->table . $this->where. $this->orderby . $this->limit;  
        $stmt = new_pdo::linkdb()->prepare($sql);   // new pdo并预处理sql语句
        $stmt->execute();      // 执行sql语句
        return $stmt->fetchAll(\PDO::FETCH_ASSOC);     // 向外返回结果
    }
    // 新增 更新 删除 已完成,代码略
}

class Dbop // 参数整理类 
{
    public $tablename = null;
    public $fieldname = null;
    public $wherename = null;
    public $limitname = null;
    public $orderbyname = null;

    public function find($param) // 参数整理方法及执行查询操作
    {
        // 分配数组参数
        if (is_array($param)) {
            foreach ($param as $k => $v) {
                switch ($k) {
                    case 'field': // 字段名
                        $this->fieldname = $v;
                        break;
                    case 'where': // 条件
                        $this->wherename = $v;
                        break;
                    case 'limit':  // 数量
                        $this->limitname = $v;
                        break;
                    case 'orderby': // 排序方式
                        $this->orderbyname = $v;
                        break;
                    case 'table': // 表名
                        $this->tablename = $v;
                        break;
                    default:
                        break;
                }
            }
        }  

        $a=new Dbinfo(); // 调用sql语句方法 //可以改用静态方法调用,需要加一个父类       
        return $a->table($this->tablename)
        ->field($this->fieldname)
        ->where($this->wherename)
        ->limit($this->limitname)
        ->orderby($this->orderbyname)
        ->select(); // 链式调用传叁及返回结果
    }
}
?>


view.php 代码实例

<?php 
namespace _101101;
class view{
    public function display($data)  // 拼装html代码的方法
    {
        $table = '<table border="1" cellspacing="0" width="800">';
        $table .= '<caption>电影信息表</caption>';
        $table .= '<tr bgcolor="lightblue"><th>ID</th><th>电影类别</th><th>电影名</th><th>图片</th><th>简介</th></tr>';
        foreach ($data as $product) {
            $table .= '<tr>';
            $table .= '<td width="30px">' . $product['mov_id'] . '</td>';
            $table .= '<td width="70px">' . $product['cate_id'] . '</td>';
            $table .= '<td width="130px">' . $product['name'] . '</td>';
            $table .= '<td width="70px">' . $product['image'] . '</td>';
            $table .= '<td>' . $product['detail'] . '</td>';
            $table .= '</tr>';
        }
        $table .= '</table>';  
        return $table;     //返回拼装好的 html代码 
    }
}


路由分拆实例

分析地址: http://app.io/PHPtask/1011/mvc/route.php?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=switch%20php&oq=switch&rsv_pq=dc01453400008c1e&rsv_t=625cSJbf52nykC8m%2F%2FLMaVmC4d22vTDPptUQ6IuUq7OxWkBKBFAcEYRoH3E&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_sug3=4&rsv_sug1=2&rsv_sug7=100&rsv_sug2=0&inputT=1440&rsv_sug4=1441

$uri = $_SERVER['REQUEST_URI'];
echo $uri;
$req = explode('?', $uri);  // 分拆? 后面的内容
$req = explode('&', $req[1]); // 分拆 & 符内容
//foreach 循环赋值 方法 分拆 = 内容
foreach ($req as $valus) {
    $valus1 = explode('=', $valus);
    $params[$valus1[0]] = $valus1[1];
}
echo '<pre>'. print_r($params, true);
//for 计数 循环赋值 方法 分拆 = 内容
for ($i=0; $i<count($req); $i+=1) {
    $valus1= explode('=', $req[$i]);
    $params[$valus1[0]] = $valus1[1];
}

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

$valus = array_slice($params, 5, 6); //  获取想要的内容
echo '<pre>'. print_r($valus, true);

效果图如下 :

TIM截图20191017132721.png

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