博客列表 >第17章 设计模式与MVC-2019年10月11日20时00分

第17章 设计模式与MVC-2019年10月11日20时00分

Tommy-黄天浩的博客
Tommy-黄天浩的博客原创
2019年10月16日 16:18:23554浏览
  1. 写一个依赖注入的案例, 内容自定义。

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

新建一个Model.php文件作为模型类,代码如下:

实例

<?php 
//模型类
class Model{
    public function getData(){
        return [
            ['id'=>1, 'name'=>'张三','sex'=>'男','age'=>18],
            ['id'=>2, 'name'=>'李四','sex'=>'男','age'=>46],
            ['id'=>3, 'name'=>'王五','sex'=>'女','age'=>29],
        ];
    }
}

运行实例 »

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

新建一个文件View.php作为视图类,代码如下:

实例

<?php

//视图:渲染数据

class View{
    public function fetch($data){
        $info ='';

        foreach($data as $v){
            $info .= '账号ID:'.$v['id'].',姓名:'.$v['name'].',性别:'.$v['sex'].',年龄:'.$v['age'].'<br>';
        }
        
        return $info;
    }

   
}

运行实例 »

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

新建文件index.php加载前面两个类:

实例

<?php
//加载模型类
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();

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

echo (new Controller())->index($model,$view);

运行实例 »

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

运行后效果如图所示:

QQ截图20191016154114.png


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

实例

<?php
//模型类
class Model{
    public function getData(){
        return 'MVC案例演示';
    }
}
//视图类
class View{
    public function fetch($data){
        return '<h1>'.$data.'</h1>';
    }
}

// 创建服务器容器: 对象管理器
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();
});

// 控制器
class Controller
{

    // 将容器对象注入到index()
    public function index(Container $container)
    {
        // 1. 获取数据
        $data = $container->make('model')->getData();

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

// 客户端调用控制器

$controler = new Controller();

echo $controler->index($container);

运行实例 »

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

运行后效果如图所示:

QQ截图20191016154114.png


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

实例

<?php

$uri=$_SERVER['REQUEST_URI'];
echo $uri;

$req=explode('/',$uri);
echo '<pre>'.print_r($req,true);

$route=array_slice($req,3,3);
echo '<pre>'.print_r($route,true);

list($module, $controller, $action) = $route;
echo '模块: '.$module.'<br>控制器: '.$controller. '<br>操作: '. $action;

$valus = array_slice($req, 6, 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 Index{
    public function add($name,$sex,$age){
        return '姓名:'.$name.'性别:'.$sex.'年龄:'.$age;
    }
}

// 路由的目标, 就是将URL中的操作映射到控制器中的方法上
echo call_user_func_array([(new Index()),'add'],$params);

运行实例 »

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

运行后效果如图所示:

QQ截图20191016154114.png

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