shopnc流程(一)

shopnc是國內比較成熟的一套b2b2c系統。咱們也開發過本身的一套b2b2c系統,可是相比較了下,確實有很多的差距。
  通常在初期咱們只會用到目錄裏的shop文件夾。(訪問默認的首頁)
  $site_url = strtolower('http://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/index.php')).'/shop/index.php');
include('shop/index.php');
會自動跳轉到shop/index.php裏面去。
   每一個項目都會有對應index.php(好比cms,mobile等項目裏面)用來定義各個項目的屬性。(該文件主要加載一些內置文件和資源)
   同時運行核心函數方法:Base::Run()
    public static function run(){
        self::cp();
        self::init();          
        self::control();
    }
   該方法是一個靜態方法(該Base類也是一個final類,對於肯定了沒有繼承的類,用final繼承類能夠提高運行效率,輸出肯定的方法)
   在run的方法中,運行了Base自身類的cp,init,control方法cp主要是用來限定肯定的host訪問的
   private static function cp(){
        if (self::CPURL == '') return;
        if ($_SERVER['HTTP_HOST'] == 'localhost') return;
        if ($_SERVER['HTTP_HOST'] == '127.0.0.1') return;
        if (strpos(self::CPURL,'||') !== false){
            $a = explode('||',self::CPURL);
            foreach ($a as $v) {
                $d = strtolower(stristr($_SERVER['HTTP_HOST'],$v));
                if ($d == strtolower($v)){
                    return;
                }else{
                    continue;
                }
            }
            header('location: http://www.test.com');exit();
        }else{
            $d = strtolower(stristr($_SERVER['HTTP_HOST'],self::CPURL));
            if ($d != strtolower(self::CPURL)){
                header('location: http://www.test.com');exit();
            }
        }
    }
     該方法分析:從程序結構上,感受沒有什麼做用,校驗是否是指定的網址。可是對於受權的域名網址卻很是有用,起初我一直沒有明白這個方法作什麼用的,覺得是爲了防止CSRF攻擊,可是csrf攻擊自己仍是調用了對應的URL,沒法進行避免。可是對於加密受權做用卻很是大。假如該套程序受權給了www.test.com,www.test1.com倆個域名使用,同時把Base文件進行加密處理,而後爲其配置對應的文件。正常狀況下,系統是能夠運行的,可是隻有該域名能夠正常運行(這就是程序綁定運行域名的邏輯)。
     初始化方法,通常系統的初始化方法都差很少,主要初始化對應參數配置(該配置能夠經過當前的項目定義進行獲取,同時開啓session)還有一些語言配置。
     核心方法control
     private static function control(){
        //二級域名
        if ($GLOBALS['setting_config']['enabled_subdomain'] == '1' && $_GET['act'] == 'index' && $_GET['op'] == 'index'){
            $store_id = subdomain();
            if ($store_id > 0) $_GET['act'] = 'show_store';
        }
        $act_file = realpath(BASE_PATH.'/control/'.$_GET['act'].'.php');
        $class_name = $_GET['act'].'Control';     
        if (!@include($act_file)){                  
            if (C('debug')) {
                throw_exception("Base Error: access file isn't exists!");
            } else {
                showMessage('抱歉!您訪問的頁面不存在','','html','error');
            }
        }           
        if (class_exists($class_name)){
            $main = new $class_name();
            $function = $_GET['op'].'Op';                     
            if (method_exists($main,$function)){                    
                $main->$function();
            }elseif (method_exists($main,'indexOp')){
                $main->indexOp();
            }else {                 
                $error = "Base Error: function $function not in $class_name!";
                throw_exception($error);
            }
        }else {                         
            $error = "Base Error: class $class_name isn't exists!";
            throw_exception($error);
        }
    }
      該方法的總結:該方法根據url傳遞的act和op找到對應默認的class和操做方法(這種自動加載實例化的方法和最簡單的mvc結構裏設置的其實思路是同樣的)。採用了自動加載類Base::autoload.
    小結:
    用了一個訪問域名運行檢測,作受權認證。全局變量參數控制載入不一樣的配置,生成不一樣的網站。(一個大系統架設多個網站系統的思路,這樣能夠公用相同部分的配置)。用final肯定基類不容許繼承(同時有助於加密)。自動加載設定好加載對應項目的控制器,經過外部訪問act和op的方式訪問不一樣的方法,通用框架類的自動加載方法。php

相關文章
相關標籤/搜索