MVC工作原理与入门实例

一、MVC简介

**书面解释:**MVC全名是Model View Controller,是模型-视图-控制器的缩写,一种软件设计典范,是一种业务逻辑和数据显示分离的方法组织代码,将业务逻辑被聚集的一个部件里。在界面和用户围绕数据的交互能被改进和个性化定制的同时而不需要重新编写业务逻辑。

学习MVC的目的:

  1. 快速上手各大主流PHP框架,例如yii框架、Thinkphp、ci等
  2. 快速适应多数公司的web开发需求
  3. 逐步接触和了解web系统架构的知识,为日后成为系统架构的中间力量做准备

MVC解决的问题:

在PHP还不支持面向对象之前,过程化的模式来创建。他们将像数据库查询语句这样的数据层代码和像HTML这样的表示层代码混在一起。这样编写的代码程序十分的混乱。

  • 维护难
  • 开发速度慢
  • 二次开发难度高,工作量大

MVC的优势:

  • 三个层各司其职,互不干扰,有利于开发中的分工;
  • 有利于代码的重用;

二、MVC的组成与原理

MVC全名是Model View Controller, 是模型-视图-控制器的缩写。

  • 视图:我们能看到的web界面。
  • 控制器:向系统发出指令的工具和帮手。
  • 模型:模型的工作是按要求从数据库取出数据,当然这个解释还不全面,后面再逐步理解。

MVC制作小实例(1)

1、创建第一个控制器类:testController.class.php

class testController{
    function show(){
    }
}

2、制作第一个模型文件:testModel.class.php

class testModel{
    function get()
    {
        return "hello world";
    }
}

3、创建第一个视图文件:testView.class.php

class testView{
    function display($data)
    {
        echo $data;
    }
}

MVC工作流程

  • 第一步:浏览者 -> 调用控制器,对它发出指令
  • 第二步:控制器 -> 按指令选取一个合适的模型
  • 第三步:模型 -> 按控制器指令取相应数据
  • 第四步:控制器 -> 按指令选取相应的视图
  • 第五步:视图 -> 把第三步取到的数据按用户想要的样子显示出来

三、MVC制作小实例(2)

  • index.php 是作为项目的唯一的入口文件,所有的请求都需要经过它。
  • 在入口文件中,我们载入了一些类。
  • 我们实例化了控制器类,并且调用了控制器类的show()方法。

入口文件:

<?php 
    require_once('testController.class.php');
    require_once('testModel.class.php');
    require_once('testView.class.php');

    $testController = new testController();
    $testController->show();
?>

控制器:

class testController{
    function show(){
        // 控制器的作用是调用模型,并调用视图,将模型产生的数据传递给视图,并让相关视图去显示
        $testModel = new testModel();
        $data = $testModel->get();
        $testview = new testView();
        $testview -> display($data);
    }
}

四、入口程序

在网上经常被称为单一入口机制,单一入口指在一个web应用程序中,所有的请求都是指向一个脚本文件,例如我们经常看到某一个网站所有的页面都是index.php?xxxx这样的形式。所有对使用程序的访问都是必须通过这个入口。

url形式: index.php?controller=控制器名&method=方法名
http://mvc.com/index.php?controller=test&method=show

目录规范:

  • mvc/
  • mvc/libs/
  • mvc/libs/Controller
  • mvc/libs/Controller/testController.php
  • mvc/libs/Model
  • mvc/libs/Model/testModel.php
  • mvc/libs/View
  • mvc/libs/View/testView.php
  • mvc/index.php

简易调用、实例化控制器

建立一个控制器调用函数C:

function C($name, $method)
{
    require_once('./libs/Controller/'.$name.'Controller.class.php');
    eval('$obj = new '.$name.'Controller();$obj->'.$method.'();')
}

建立一个模型调用函数M:

function M($name){
    require_once('./libs/Model/'.$name.'Model.class.php');
    eval('$obj = new '.$name.'Model();');
    return $obj;
}

建立一个视图调用函数V:

function V($name){
    require_once('./libs/View/'.$name.'View.class.php');
    eval('$obj = new '.$name.'View();');
    return $obj;
}

入口文件的改造与功能总结:

1、统一入口文件为首的URL格式

2、在入口文件里使用安全的方式接收传递来的控制器名和方法名

入口文件:

//url形式 index.php?controller=控制器名&method=方法名
require_once('function.php');
$controllerAllow = array('test', 'index');
$methodAllow = array('test'. 'index', 'show');

$controller = in_array($_GET['controller'], $controllerAllow)?$_GET['controller']:'index';
$method = in_array($_GET['method'], $methodAllow)?$_GET['method']:'index';

C($controller, $method);

控制器:

class testController{
    function show(){
        // 控制器的作用是调用模型,并调用视图,将模型产生的数据传递给视图,并让相关视图去显示
        $testModel = M('test');
        $data = $testModel->get();
        $testview = V('test');
        $testview -> display($data);
    }
}