一、MVC概述
MVC并不是一段代码,而是一种软件的设计思想,可以指导我们开发项目。
- Model模型:主要功能,负责与数据库进行操作(增删改查)
- View视图:主要功能,负责显示输出用户操作界面
- Controller控制器:主要功能,负责接收用户请求,处理业务逻辑
二、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();