依赖注入,MVC的基本原理和路由的解析-2019年10月11日

2019年10月19日 23:40:17阅读数:536博客 / 西门吃雪 / 第8期前端开发

1. 写一个依赖注入的案例, 内容自定义 

2. 写一个mvc应用的案例, 内容自定义 

3. 写一个简单的路由, 理解路由的原理与目标

课程笔记:

* 单例模式

* 1. 一个类, 仅允许实例化一次, 即允许创建一个实例

* 2.应用场景: 数据库的连接对象,HTTP请求,游戏中的主角...

* clone可以克隆出全新的对象

 工厂模式:批量生产对象

M: Model, 模型, 数据, 主要针对的是数据库的操作, CURD

V: View, 视图, html文档,浏览器用户看到内容/页面

C: Controller, 控制器, 模型和视图都必须在控制器中调用

代码最好做到高内聚低耦合

// 将Model和View的类实例, 作为参数,注入到控制器的方法中

// 这就叫:依赖注入

 explode — 使用一个字符串分割另一个字符串

 array_slice — 从数组中取出一段

clone  可以克隆对象

eg: $obj3 = clone $obj2;

控制器中的构造方法可以简化代码

:在一个类中我们在构造方法中初始化的属性我们可以用到该类的所有方法中 实现参数的共享


依赖注入更好的方法是构造方法


    服务容器:将对象的创建和使用过程统一管理起来。对象的管理器,把对象的实例化放在容器中,然后把对象从容器中取出来。

门面模式(facade):把调用代码静态化。        


QQ截图20191019210913.jpg

QQ截图20191019211103.jpg


依赖注入案例

<?php
/**
 * MVC思想
 * 任务: 将商品信息展示出来
 */

// 加载: 模型类
require 'Model.php';

// 加载: 视图类
require 'View.php';

// 控制器
class Controller
{
    public function index(Model $model, View $view)
    {
        // 1. 获取数据
        
        $data = $model->getData();

        // 2. 渲染模板/视图
       
        return $view->fetch($data);
    }
}

// 客户端调用控制器
// 将模型与视图的实例化过程 放在控制器的外部实现
$model = new Model();
 $view = new View();



$controler = new Controller();

// 将Model和View的类实例, 作为参数,注入到控制器的方法中
// 这就叫:依赖注入

//注入点:
//1.   控制器中的普通方法
//2.  控制器中的构造方法
echo $controler->index($model, $view);

运行效果图 :

QQ截图20191019211443.jpg

写一个mvc的小案例

Model.php

<?php

class Model{


    public function getData(){
        $dsn = "mysql:host=127.0.0.1;dbname=php";
        $username = "root";
        $password = "123456";
        $pdo = new PDO($dsn,$username,$password);
        $sql = "select * from `staff`";
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
        $array = $stmt->fetchAll(PDO::FETCH_ASSOC);
        return $array;
    }
}

View.php

<?php
class View{
    public function fetch($data){
        $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><th>手机</th><th>入职日期</th></tr>';

        foreach ($data as $product) {
            if($product['sex']==1){
                $product['sex'] = '男';
            }else{
                $product['sex'] = '女';
            }
            $product['hiredate'] = date('Y年m月d日',$product['hiredate']);

            $table .= '<tr>';
            $table .= '<td align="center">' . $product['staff_id'] . '</td>';
            $table .= '<td align="center">' . $product['name'] . '</td>';
            $table .= '<td align="center">' . $product['age'] . '</td>';
            $table .= '<td align="center">' . $product['sex'] . '</td>';
            $table .= '<td align="center">' . $product['position'] . '</td>';
            $table .= '<td align="center">' . $product['mobile'] . '</td>';
            $table .= '<td align="center">' . $product['hiredate'] . '</td>';
            $table .= '</tr>';
        }
        $table .= '</table>';

        return $table;
    }
}

运行效果图

运用依然是demo1的代码 

运行效果

QQ截图20191019213216.jpg

写一个简单的路由, 理解路由的原理与目标


<?php 

//路由的原理


// //m.sbmmt.com:9096/1011/mvc/route.php

// 1. 从url 路径中解析出独立的单元

$uri = $_SERVER['REQUEST_URI'];


echo $uri;

$req = explode('/', $uri);

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


//admin: 后台模块

//User: 控制器

//add: 控制器中的方法

$route = array_slice($req, 4, 3);

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


list($module, $controller, $action) = $route;

echo '模块:'.$module.'<br>控制器:'.$controller. '<br>操作: '. $action;

////m.sbmmt.com:9096/1011/mvc/route.php/admin/user/add/name/wanwu/age/36/salary/9988


// /name/wanwu/age/36/salary/9988:参数

$valus = array_slice($req,7,6);

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


for ($i=0; $i<count($valus); $i+=2){

$params [$valus[$i]] = $valus[$i+1];

}

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

// 控制器

class User

{

    public function add($name, $age, $salary)

    {

        return __METHOD__. ': 姓名: '.$name.', 年龄: '.$age. ', 工资: '. $salary;

    }

}


// 路由的目标, 就是将URL中的操作映射到控制器中的方法上

echo call_user_func_array([(new User()), 'add'], $params);
















 ?>


运行效果

如图

QQ截图20191019213418.jpg


批改状态:合格

老师批语:完成的不错。

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • 博主信息
    西门吃雪
    博文
    26
    粉丝
    0
    评论
    3
    访问量
    16006
    积分:0
    P豆:60