博客列表 >MVC案例和依赖注入方法以及路由原理-2019-10-12

MVC案例和依赖注入方法以及路由原理-2019-10-12

H先生
H先生原创
2019年10月13日 18:20:051150浏览



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

1.png


DEMO2

实例

<?php
/**
 * MVC 思想
 * 任务:将商品信息展示出来 *
 */
//1. 依赖注入的案例

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

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

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

        $data = $model->getData();

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

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

$controller = new Controller();

// 将Model 和View的类实现,作为参数,注入到控制器的方法中 这就是依赖注入方法
// 注入点是:index 普通方法
// 1.控制器中的普通方法
// 2.控制器中的构造方法 (优点:简化代码 ,多对象使用)
echo $controller->index($model, $view);

?>

运行实例 »

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


Model 模型类:操作数据库

实例

<?php

// 模型类:操作数据库
class Model
{
    public function getData()
    {
        return [
            ['id'=>1, 'name'=>'苹果电脑', 'model'=>'MacBook Pro', 'price'=>25800],
            ['id'=>2, 'name'=>'华为手机', 'model'=>'P30 Pro', 'price'=>4980],
            ['id'=>3, 'name'=>'小爱同学', 'model'=>'AI智能音响', 'price'=>299],
        ];
    }
}

?>

运行实例 »

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



view 视图类:渲染数据


实例

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

class View
{
    public function fetch($data)
    {
        $table = '<table border="1" cellspacing="0" width="400">';
        $table .= '<caption>商品信息表</caption>';
        $table .= '<tr bgcolor="#add8e6"><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;
    }
}

?>

运行实例 »

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




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


1.png




实例

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


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

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

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

        // 2. 渲染模版/视图
        $view = new View();
        return $view->fetch($data);
    }
}

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

?>

运行实例 »

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



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


1.png





实例

<?php


// 路由的原理
// 字符串解析为数组使用explode() 第一个为/ 分隔符,第二个处理的数组
// 1.从url路径中解析出独立的单元
$url = $_SERVER['REQUEST_URI'];
echo $url;
$req = explode('/' , $url);
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;

//http://php.io/1011/mvc/route.php/admin/user/add/name/maomao/age/36/salary/3300

// /name/maomao/age/36/salary/3300

// array_slice()从数组中取出一些数据
$values = array_slice($req,7,6);
echo '<pre>'. print_r($route,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);


?>

运行实例 »

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



































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