Blogger Information
Blog 28
fans 0
comment 0
visits 19701
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
1011 容器注入 mvc结构 路由分拆
没有人的夏天的博客
Original
581 people have browsed it
  • 容器注入:  // 容器,和 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

Correction status:qualified

Teacher's comments:完成的不错
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