程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php項目中商店mvc框架總結(1),mvc框架

php項目中商店mvc框架總結(1),mvc框架

編輯:關於PHP編程

php項目中商店mvc框架總結(1),mvc框架


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);
    }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved