理解和实现MVC设计模式

一、MVC概述

MVC并不是一段代码,而是一种软件的设计思想,可以指导我们开发项目。

  • Model模型:主要功能,负责与数据库进行操作(增删改查)
  • View视图:主要功能,负责显示输出用户操作界面
  • Controller控制器:主要功能,负责接收用户请求,处理业务逻辑

二、MVC原理图

理解和实现MVC设计模式

三、PHP实现MVC

Think.class.php

//为防止非法入侵
if(!defined('TOKEN')) exit;
//定义Think类文件,负责项目初始化九步走
class Think {
    /**
     * 定义setHeader函数,定义项目的编码格式
     */
    private static function setHeader() {
        //设置响应头信息:告诉浏览器以何种方式解析文档
        header('Content-type:text/html; charset=utf-8');
    }

    /**
     * 定义setConst函数,定义项目路径常量
     */
    private static function setConst() {
        //设置路径常量
        define('ROOT_DIR',str_replace('\', '/', realpath(dirname(__FILE__).'/../')));
        //定义核心目录
        define('CORE_DIR',ROOT_DIR.'/Core');
        define('CONFIG_DIR',ROOT_DIR.'/Config');
        define('CONTROLLER_DIR',ROOT_DIR.'/Controller');
        define('MODEL_DIR',ROOT_DIR.'/Model');
        define('VIEW_DIR',ROOT_DIR.'/View');
        define('PUBLIC_DIR','/Public');
    }

    /**
     * 设置错误信息
     */
    private static function setError() {
        if(DEBUG) {
            //开发模式
            //设置是否显示错误(On显示Off不显示)
            ini_set('display_errors','On');
            //设置显示错误级别
            error_reporting(E_ALL);
        } else {
            //生产模式
            ini_set('display_errors','Off');
            error_reporting(0);
        }
    }

    /**
     * 设置session信息
     */
    private static function setSession() {
        session_start();
    }

    /**
     * 设置配置文件信息
     */
    private static function setConfig() {
        $GLOBALS['config'] = include CONFIG_DIR.'/config.php';
    }

    /**
     * 设置文件自动加载
     */
    private static function loadCore($class) {
        if(is_file(CORE_DIR."/$class.class.php")) {
            include CORE_DIR."/$class.class.php";
        }
    }

    private static function loadController($class) {
        if(is_file(CONTROLLER_DIR."/$class.class.php")) {
            include CONTROLLER_DIR."/$class.class.php";
        }
    }

    private static function loadModel($class) {
        if(is_file(MODEL_DIR."/$class.class.php")) {
            include MODEL_DIR."/$class.class.php";
        }
    }

    private static function setAutoLoad() {
        //把以上三个函数注册到SPL __autoload函数栈中
        spl_autoload_register('self::loadCore');
        spl_autoload_register('self::loadController');
        spl_autoload_register('self::loadModel');
    }

    /**
     * 设置url
     * @param string c:控制器名称
     * @param string a:操作名称(函数名称)
     */
    private static function setUrl() {
        $controller = isset($_REQUEST['c'])?$_REQUEST['c']:'Index';
        $action = isset($_REQUEST['a'])?$_REQUEST['a']:'index';
        //c=Public a=captcha
        //永远不要相信用户的输入
        $controller = strtolower($controller);
        $action = strtolower($action);
        //设置控制其名称首字母大写
        $controller = ucfirst($controller);
        /*
        echo $controller;
        echo '<hr />';
        echo $action;
        */
        //例1:index.php?c=goods&a=index通过setUrl函数自动转化为c=Goods&a=index
        define('CONTROLLER',$controller);
        define('ACTION',$action);
    }

    /**
     * 设置访问权限
     */
    private static function setPrivilege() {
        if(!(CONTROLLER=='Public' && (ACTION=='captcha' || ACTION=='login' || ACTION=='signin'))) {
            if(!isset($_SESSION['adminuser'])) {
                //如果系统中需要Cookie,也是在这里进行判断
                //如果没有设置session,强制调整到Public控制器下的login方法,要求必须登录后才能跳转
                header('Location:index.php');
            }
        }
    }

    /**
     * 设置路由(请求分发)
     */
    private static function setDispatch() {
        //获取Controller与action参数,进行组装
        //CONTROLLER = 'Category'
        //ACTION = 'index'
        $controller = CONTROLLER.'Controller';  //CategoryController  PublicController
        $action = ACTION;  //$action = index  //$action = captcha
        //实例化控制器
        $controller = new $controller();  //new  CategoryController();
        //调用控制器下的action方法
        $controller->$action();  //$controller->index();
    }

    /**
     * 定义run方法实现项目的初始化
     */
    public static function run() {
        //初始化9个函数
        self::setHeader();
        self::setConst();
        self::setError();
        self::setSession();
        self::setConfig();
        self::setAutoLoad();
        self::setUrl();
        //self::setPrivilege();
        self::setDispatch();
    }
}

index.php

//定义TOKEN密钥
define('TOKEN', 'jason');
//定义环境(生产环境、开发环境)
define('DEBUG', true);
//载入项目的核心文件
include './Core/Think.class.php';
//进行项目的初始化
Think::run();