MVC的开发模式在这里就不在赘述
成熟的MVC框架有很多,本文的目的是在帮助初学者了解MVC的工作原理
直入主题
其中Application目录下:包括配置文件,控制器目录,模型,视图
MyPHP框架目录下:有核心文件,数据库操作类,帮助类,第三方类等
core目录下:控制器基类,框架核心类,模型基类
创建完这些基本的目录后,在项目的根目录下创建index.php目录,这是所有请求的入口
<?php ???// 引入框架核心类 ???include "MyPHP/core/Framework.class.php"; ???// 调用初始化方法 ???Framework::run();
在Framework.class.php中对请求地址进行解析,实例化对应控制器,执行相应方法
<?php ????class Framework{ ???????public static function run(){ ???????????//这里执行的顺序不能错 ???????????self::init(); ???????????self::auto_load(); ???????????self::route(); ???????} ???????//定义控制器、视图、配置文件路径,获得当前请求控制器和方法名 ???????public static function init(){ ???????????define("DS", DIRECTORY_SEPARATOR); ???????????define("ROOT", getcwd().DS); ???????????define("APP_PATH", ROOT."Application".DS); ???????????define("FRAMEWORK_PATH", ROOT . "MyPHP" .DS); ???????????define("PUBLIC_PATH", ROOT . "Public" . DS); ???????????define("MODEL_PATH", APP_PATH . "Model" . DS); ???????????define("VIEW_PATH", APP_PATH . "View" . DS); ???????????define("CONTROLLER_PATH", APP_PATH . "Controller" .DS); ???????????define("CONFIG_PATH", APP_PATH . "Config" .DS); ???????????define("CORE_PATH", FRAMEWORK_PATH . "core" .DS); ???????????define("DB_PATH", FRAMEWORK_PATH . "database" . DS); ???????????define("HELPER_PATH", FRAMEWORK_PATH . "helpers" . DS); ???????????define("LIB_PATH", FRAMEWORK_PATH . "libraries" .DS); ???????????//从用户请求中 获得 当前平台 控制器 方法 ???????????define("PLATFORM", isset($_REQUEST[‘p‘])?$_REQUEST[‘p‘]:"Home"); ???????????define("CONTROLLER", isset($_REQUEST[‘c‘])?$_REQUEST[‘c‘]:"Index"); ???????????define("ACTION", isset($_REQUEST[‘a‘])?$_REQUEST[‘a‘]:"index"); ???????????//获得当前请求控制器 和视图的路径 ???????????define("CUR_CONTROLLER_PATH", CONTROLLER_PATH.PLATFORM.DS); ???????????define("CUR_VIEW_PATH", VIEW_PATH.PLATFORM.DS); ???????????//获得文件上传路径 ???????????define("UPLOAD_PATH", PUBLIC_PATH."upload".DS); ???????????//手动载入核心类 ???????????require CORE_PATH."Controller.class.php"; ???????????require CORE_PATH."Model.class.php"; ???????????require DB_PATH."Mysql.class.php"; ???????????//载入配置文件 ???????????$GLOBALS[‘config‘] = include CONFIG_PATH."config.php"; ???????????//通常放在公共文件头部,这样各页面调用的时候就不会冲突了, 设置时区,编码,开启ob等操作一般都放 ???????????//方法头部的好处是可以在程序被调用时就自动执行,且不重复执行 ???????????session_start(); ???????} ???????//路由方法 ???????public static function route(){ ???????????//确定类名和方法名 ???????????$controller_name = CONTROLLER."Controller"; ???????????$action_name = ACTION."Action"; ???????????//实例化控制器类 ???????????$controller = new $controller_name; ???????????//实行方法 ???????????$controller->$action_name(); ???????} ???????//注册自动加载 ???????//当new 一个不存在的类时会自动调用spl_autoload_register中注册的方法,并将类名作为参数传入 ???????public static function auto_load(){ ???????????spl_autoload_register(array(__CLASS__,"load")); ???????} ???????//加载方法 ???????public static function load($className){ ???????????//控制器类和模型类,如GoodsController,AdminModel ???????????if (substr($className, -10) == ‘Controller‘){ ???????????????require CUR_CONTROLLER_PATH . "{$className}.class.php"; ???????????} elseif (substr($className, -5) == "Model"){ ???????????????require MODEL_PATH . "{$className}.class.php"; ???????????} else { ???????????????//其它情况,暂无 ???????????} ???????} ???}
测试:在地址栏中输入 http://localhost/Shop/index.php?p=Admin&c=Index&a=index
会自用调用IndexController控制器下的indexAction方法
<?php ???class IndexController{ ???????public function indexAction(){ ???????????echo "这是Controller控制器下的index方法"; ???????} ???}
PHP深入解读MVC框架(一)
原文地址:http://www.cnblogs.com/xiaoliwang/p/7952906.html