Blogger Information
Blog 77
fans 0
comment 0
visits 55246
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
依赖注入、MVC应用、路由的原理与目标_1011作业
Jet的博客
Original
633 people have browsed it

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()函数映射到控制器中的方法上



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