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);
}