1.代碼結構的劃分:
目前的目錄結構: /站點根目錄 /application/應用程序目錄 Model/模型目錄 View/視圖目錄 Back/後台 front/ test/測試平台 Controller/控制器目錄 Back/後台 front/前台 test/測試平台 /framework/框架目錄 MySQLDB.class.php 數據庫操作類DAO Model.class.php 基礎模型類 /index.php入口文件
2.請求首頁
2.1請求首頁參數實例(請求localhost/index.php?p=front&c=shop&a=index)
P=front //後台還是前台 參數有back和front C=index //控制器,此處請求首頁控制器 A=shop //動作,此處為首頁shop動作
2.2 首頁統一請求代碼
<?php //首先載入框架類 require './framework/Framework.class.php'; //運行項目 Framework::run();
2.3框架類代碼
/** * 框架類 初始化基礎功能 */ class Framework { /** * 項目框架類的運行入口 */ public static function run() { self::_initPathConst();//初始化路徑常量 self::_initConfig();//加載配置 self::_initDispatchParam();//初始化分發參數 self::_initPlatformPathConst();//初始化平台相關的路徑常量 self::_initAutoload();//注冊自動加載方法 self::_dispatch();//請求分發 } }
2.3.1初始化路徑常量
/** * 初始化路徑常量 */ private static function _initPathConst() { //確定項目中使用的路徑常量 define('ROOT_PATH', getCWD() . '/');//項目的根目錄 define('APP_PATH', ROOT_PATH . 'application/');//應用程序目錄 define('CON_PATH', APP_PATH . 'controller/');//控制器目錄 define('MOD_PATH', APP_PATH . 'model/');//模型目錄 define('VIE_PATH', APP_PATH . 'view/');//視圖層目錄 define('CFG_PATH', APP_PATH . 'config/');//配置文件目錄 define('FRW_PATH', ROOT_PATH . 'framework/');//框架目錄 define('TOL_PATH', FRW_PATH . 'tool/');//工具目錄 define('PUB_PATH', ROOT_PATH . 'public/');//公共資源目錄 define('UPD_PATH', PUB_PATH . 'upload_image/');//上傳圖片目錄 }
2.3.2加載配置文件
private static function _initConfig() { //載入加載配置文件,並將配置項的值保存與 $config,全局變量中。 $GLOBALS['config'] = require CFG_PATH . 'application.config.php'; }
2.3.3初始化分發參數
/** * 確定p,c,a參數,分發參數,(路由參數) */ private static function _initDispatchParam() { //獲得平台參數 $GLOBALS['p'] = $p = isset($_GET['p']) ? $_GET['p'] : $GLOBALS['config']['app']['default_platform'];//p,platform //獲得控制器類參數 $GLOBALS['c'] = isset($_GET['c']) ? $_GET['c'] : $GLOBALS['config'][$p]['default_controller'];//c,controller //獲得動作參數 $GLOBALS['a'] = isset($_GET['a']) ? $_GET['a'] : $GLOBALS['config'][$p]['default_action'];//a,action }
以上代碼中用到了初始加載配置文件,初始化默認請求,當你直接請求:localhost/index.php,沒有參數的時候,加載系統默認參數
2.3.4初始化平台相關的路徑常量
/** * 初始化當前平台相關的路徑常量 * 這個是用來判斷P的,找到究竟是哪個控制下 */ private static function _initPlatformPathConst() { //與當前平台相關的路徑常量 define('CUR_CON_PATH', CON_PATH . $GLOBALS['p'] . '/');//當前平台的控制器目錄 define('CUR_VIE_PATH', VIE_PATH . $GLOBALS['p'] . '/');//當前平台的視圖層目錄 }
2.3.4注冊自動加載方法
private static function _initAutoload() { //注冊自動加載 spl_autoload_register(array(__CLASS__, 'selfAutoload')); } 'selfAutoload'方法如下 public static function selfAutoload($class_name) { //先判斷是否為框架核心類,框架中可以被確定的類 $class_file = array( 'Model' => FRW_PATH . 'Model.class.php', 'MySQLDB' => FRW_PATH . 'MySQLDB.class.php', 'Controller' => FRW_PATH . 'Controller.class.php', 'SessionDB' => TOL_PATH . 'SessionDB.class.php', 'Captcha' => TOL_PATH . 'Captcha.class.php', 'Upload' => TOL_PATH . 'Upload.class.php', 'Image' => TOL_PATH . 'Image.class.php', 'Page' => TOL_PATH . 'Page.class.php', ); if (isset($class_file[$class_name])) { //是核心類 require $class_file[$class_name]; } //是否為模型類 elseif (substr($class_name, -5) == 'Model') { //模型類 require MOD_PATH . $class_name . '.class.php'; } //是否為控制器類 elseif (substr($class_name, -10) == 'Controller') { //控制器類 require CUR_CON_PATH . $class_name . '.class.php'; } }
2.3.4 請求分發
/** * 請求分發 * 將請求交由 某個控制器的某個動作完成 */ private static function _dispatch() { //實例化控制器類,與 調用相應的動作方法 //ucfirst() 函數把字符串中的首字符轉換為大寫。 $controller_name = ucfirst($GLOBALS['c']) . 'Controller';//match Match . Controller //載入控制器類 $controller = new $controller_name;//可變類名 //調用動作方法 $action_name = $GLOBALS['a'] . 'Action'; $controller->$action_name();//可變方法 }
2.3.5當我們請求localhost/index.php的時候,相當於請求localhost/index.php?p=front&c=shop&a=index於是將初始化
application\controller\front下的ShopController控制器,請求動作為indexAction
indexAction代碼如下:
public function indexAction() { //得到分類數據 $model_cat = new CatModel; $cat_list = $model_cat->getNestedList(); //載入前台首頁模板 require CUR_VIE_PATH . 'index.html'; }
需要說明的是:
1、ShopController繼承與平台控制器PlatformController,平台控制器繼承於基礎控制器類:controller
關系如下:
2、在確定好MVC中的,Control動作後,接下來就是實現Model
$model_cat = new CatModel; ——》 便是實例化catModel類 $cat_list = $model_cat->getNestedList(); ——》取得所有前台分類
3、在基礎模型中,封裝好所有基礎操作數據庫方法,其中getNestedLIst方法如下
/** * 得到嵌套的分類列表數據 */ public function getNestedList($p_id=0) { //獲得所有分類 $list = $this->getList(); //制作嵌套的數據,遞歸查找 return $this->getNested($list, $p_id); }