登录  /  注册
博主信息
博文 77
粉丝 0
评论 0
访问量 52246
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
依赖注入、MVC应用、路由的原理与目标_1011作业
Jet的博客
原创
608人浏览过

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

Model.php文件

实例

<?php
//模型类:操作数据库
class Model
{
    public function getData()
    {
        return [
            ['id'=>1, 'name'=>'苹果电脑','model'=>'MacBook Pro','price'=>25800],
            ['id'=>2, 'name'=>'一加手机','model'=>'Pro','price'=>4600],
            ['id'=>3, 'name'=>'小度同学','model'=>'AI音箱','price'=>199],
        ];
    }
}

运行实例 »

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


View.php文件

实例

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

class View
{
    public function fetch($data)
    {
        $table = '<table border="1" cellspacing="0" width="400">';
        $table .= '<caption>商品信息表</caption>';
        $table .= '<tr bgcolor="lightblue"><th>ID</th><th>品名</th><th>型号</th><th>价格</th></tr>';
        foreach($data as $product){
            $table .= '<tr>';
            $table .= '<td>' . $product['id'] . '</td>';
            $table .= '<td>' . $product['name'] . '</td>';
            $table .= '<td>' . $product['model'] . '</td>';
            $table .= '<td>' . $product['price'] . '</td>';
            $table .= '</tr>';
        }
        $table .= '</table>';
        return $table;
    }
}

运行实例 »

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


demo1.php文件(依赖注入)

实例

<?php
/**
 * MVC思想
 * 任务: 将商品信息展示出来
 * 将依赖注入点放在控制器中的构造方法中
 */

require_once 'Model.php';
require_once 'View.php';

//控制器
class Controller
{
    private $model  = null;
    private $view   = null;

    public function __construct($model, $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);
//依赖注入:将model和view的类实例,作为参数,注入到控制器的方法中
//注入点:
//1、控制器中的普通方法
//2、控制器中的构造方法
echo $controller->index();

运行实例 »

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




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

提前准备文件:

View.php

Model.php

控制器文件:

demo2.php

实例

<?php
/**
 * MVC思想
 * 任务: 将商品信息展示出来
 * 创建服务容器(简称容器),将对象的创建与使用过程统一管理起来
 * 门面Facade,外观模式,静态代理
 */

require_once 'Model.php';
require_once 'View.php';

//创建服务器容器,对象管理器
class Container
{
    //创建容器池/数组
    protected $instance = [];

    //实现类实例的实例化,并保存到一个数组中
    public function bind($alias, Closure $process)
    {
        //将类的实例化过程绑定/存入到容器中
        $this->instance[$alias] = $process;
    }

    //将类实例取出来
    public function make($alias, $params=[])
    {
        return call_user_func_array($this->instance[$alias], []);
    }
}

//将模型和视图绑定到服务容器中
$container = new Container();
//将模型绑定到容器中,起一个别名:model
$container->bind('model', function () {
    return new Model();
});
//将视图绑定到容器中,起一个别名:view
$container->bind('view',function(){
    return new View();
});

//门面Facade,外观模式,静态代理
class Facade
{
    //容器对象
    protected static $container = null;

    //保存模型中的数据
    protected static $data = [];

    //初始化方法,用来给容器对象赋值
    public static function initialize(Container $container)
    {
        static::$container = $container;
    }

    //给获取模型数据的getData()方法套一个静态马甲,静态代理
    public static function getData()
    {
        static::$data = static::$container->make('model')->getData();
    }

    //将渲染视图的fetch()方法套一个静态马甲,静态代理
    public static function fecth()
    {
       return static::$container->make('view')->fetch(static::$data);
    }

}

//声明一个商品类
class Product extends Facade
{
    //...
}

//控制器
class Controller
{
    //构造方法
    public function __construct(Container $container)
    {
        Product::initialize($container);
    }

    //将容器对象注入到index()
    public function index()
    {
        //1、获取数据     
        Product::getData();
        //2、渲染模板/视图
        return Product::fecth();
    }
}

//客户端调用控制器
$controller = new Controller($container);
echo $controller->index();

运行实例 »

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




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

01.jpg

实例

<?php
//路由原理

//1、从url路径中解析出独立 的单元
$url = $_SERVER['REQUEST_URI'];
echo $url;
$req = explode('/', $url);
echo '<pre>' . print_r($req, true);

//admin: 后台模块
//user:控制器
//add:控制器中的方法

//array_slice:(数组,索引,取多少位)
$route = array_slice($req, 5, 4);
echo '<pre>' . print_r($route, true);

//list:(分别给value赋变量)
list($module, $controller, $action) = $route;
echo '模块:' .$module. '<br />控制器:' .$controller. '<br />操作:' .$action;

///02_php/1011/mvc/demo5.php/admin/user/add/name/peter/age/36/salary/9988

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

$values = array_slice($req,8,6);
echo '<pre>' . print_r($values, true);


for($i=0; $i<count($values);$i+=2){
    $params[$values[$i]] = $values[$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);

//路由:
//几个重点单词:
//1、
//$url = $_SERVER['REQUEST_URI'];
//读取从url路径中解析出独立 的单元
//2、array_slice(数组,索引,取多少位)
//3、list($module, $controller, $action) = $route;
//分别给values赋变量名称
//原理:
//1、先获取url单元,拆分模块以及参数
//2、循环参数后赋值数组上即可
//3、路由目标,可用call_user_func_array()函数映射到控制器中的方法上

运行实例 »

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



小结:

1、依赖注入:可将模型和视图的实例化过程,放在控制器的外部实现;作为参数,注入到控制器的方法中

2、MVC:

Model:数据库操作类

View:视图类

Controller:控制类

2.1 在原有基础上,创建服务器容器,对对象的管理,将模型和视图绑定到服务容器中,调用;

2.2 门面Facade,将控制器方法套上静态马甲

2.3 控制方法,构造方法,获取容器(门面Facade),调用方法,获取数据

3、路由原理以及目标

//路由:
//几个重点单词:
//1、
//$url = $_SERVER['REQUEST_URI'];
//读取从url路径中解析出独立 的单元
//2、array_slice(数组,索引,取多少位)
//3、list($module, $controller, $action) = $route;
//分别给values赋变量名称
//原理:
//1、先获取url单元,拆分模块以及参数
//2、循环参数后赋值数组上即可
//3、路由目标,可用call_user_func_array()函数映射到控制器中的方法上



批改状态:合格

老师批语:课堂上用最简单的案例演示了常用的几个设计 模式, 一定要深刻的理
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学