摘要:我的博客原文地址前臺與后臺根據(jù)功能的不同,我們將網(wǎng)站分為前臺和后臺。同樣,在網(wǎng)站應(yīng)用的編碼實現(xiàn)時,我們也需要根據(jù)前臺后臺的功能不同來進(jìn)行代碼的安排和組織。
我的博客原文地址 http://www.qinblog.net/Articl...前臺與后臺
根據(jù)功能的不同,我們將網(wǎng)站分為前臺和后臺。前臺用于展示內(nèi)容給用戶,后臺用于管理員管理網(wǎng)站內(nèi)容。
同樣,在網(wǎng)站應(yīng)用的編碼實現(xiàn)時,我們也需要根據(jù)前臺、后臺的功能不同來進(jìn)行代碼的安排和組織。
那么,使用CodeIgniter(以3.x版本為例)搭建的網(wǎng)站,前后臺應(yīng)該怎么劃分呢?
如果有使用過ThinkPHP的朋友,肯定會熟悉下面這張圖(TP3.2)
TP中實現(xiàn)多應(yīng)用是很簡單的,框架本省支持應(yīng)用分組,創(chuàng)建一個新的應(yīng)用只需在application中新建一個文件夾復(fù)制相關(guān)內(nèi)容即可,而且支持公有模型、配置,且支持配置文件優(yōu)先級。
比起來CI框架并不支持這樣的功能,CI提供了兩種方案給用戶解決多應(yīng)用問題:
1、創(chuàng)建子目錄在Model、Controller等文件夾下建立子文件夾,加載相關(guān)模型、控制器時只需加上子目錄即可,如下
2、多應(yīng)用多入口在application下建立多個應(yīng)用文件夾,每個文件夾下是一個應(yīng)用,為每個應(yīng)用創(chuàng)建入口文件,定義application路徑,如下
兩種方式的特點1、創(chuàng)建子目錄方式: 屬于一個CI應(yīng)用,共享配置文件,無法進(jìn)行多帶帶的配置設(shè)置,比如后臺要開鉤子功能但是前臺不需要,或者前后臺需要分別加載各自的模塊時,這種搭建方式就不是那么友好了。
2、多應(yīng)用多入口: 前后臺分為多帶帶的CI應(yīng)用,可以多帶帶進(jìn)行配置,通過各自的入口文件訪問,應(yīng)用完全分離,但是無法進(jìn)行模型、自定義類庫的共享。
方案的選擇無論選擇哪種方案,都要跟著實際需求去選擇,你的項目前后臺是否需要多帶帶的配置?是否是兩個隊伍分別開發(fā)前后臺?等等。
就以我的博客為例,我選擇了第2種方案。
那么第2種方案無法共享模型、類庫的問題怎么解決呢?同樣的數(shù)據(jù),難道我要為了前后臺寫兩份模型出來嗎?
OK,顯然CI并沒有給我們提供分組、共享模型的功能,但是CI的特點之一就是“可擴(kuò)展”,需要你自己動手做一些東西,這個框架沒那么豐富,但卻小巧、靈活,這也是CI的樂趣之一。
多入口應(yīng)用搭建 搭建目錄、設(shè)置入口文件將application種的文件復(fù)制兩份,分別為home和admin(前后臺)
設(shè)置入口文件的 $application_folder 變量
前臺: index.php
后臺: admin.php
此時在兩個應(yīng)用中創(chuàng)建不同的welcome控制器、視圖,分別訪問index.php
,admin,php就能分別訪問到不同的應(yīng)用了。
CI的model、視圖、類庫等的加載都是靠核心類Loader.php完成的,代碼文路徑為system/core/Loader.php。
在Loader.php的80行左右,有如下代碼,設(shè)置了model、helper、librariy的初始尋找路徑
/** * List of paths to load libraries from * * @var array */ protected $_ci_library_paths = array(APPPATH, BASEPATH); /** * List of paths to load models from * * @var array */ // 模型初始尋找路徑數(shù)組 protected $_ci_model_paths = array(APPPATH); /** * List of paths to load helpers from * * @var array */ protected $_ci_helper_paths = array(APPPATH, BASEPATH);
以model的加載為例,在320行左右,CI_Loader類的model方法中,讀取了$_ci_model_paths屬性,并依次讀取初(第一個元素優(yōu)先級最高)始的model路徑數(shù)組,拼接成要加載的model路徑,對model進(jìn)行加載。
// 循環(huán)路徑數(shù)組 foreach ($this->_ci_model_paths as $mod_path) { //如果不存在該路徑,繼續(xù)查找下一個路徑 if ( ! file_exists($mod_path."models/".$path.$model.".php")) { continue; } // 加載model文件 require_once($mod_path."models/".$path.$model.".php"); if ( ! class_exists($model, FALSE)) { throw new RuntimeException($mod_path."models/".$path.$model.".php exists, but doesn"t declare class ".$model); } // 加載文件后不繼續(xù)加載其他尋找路徑中的文件 // 尋找路徑中的優(yōu)先級:左邊最高 break; }
分析代碼后我們很容易看到,只要修改$_ci_model_paths 屬性的初始值,添加一個尋找路徑(公有路徑)到尋找路徑數(shù)組的最前,就能優(yōu)先在這個路徑中尋找、加載模型了。
當(dāng)然,這里有個問題,要直接修改Loader.php源碼嗎?
NO
CI提供了核心類擴(kuò)展、替換功能,我們只需把Loader.php拷貝到home、admin兩個應(yīng)用中的core文件夾中,依次修改即可完成核心類的替換。
要實現(xiàn)共享路徑,第一步,在application中添加一個common應(yīng)用,為model、helper等添加文件夾
第二部,入口文件index.php和admin.php中定義常量,參考CI的常量定義代碼來定義
// 公共搜索路徑 $common_path = "application/common/"; if(is_dir($common_path)){ // 取得絕對路徑 if (($_temp = realpath($common_path)) !== FALSE) { $common_path = $_temp; } else { $common_path = strtr( rtrim($common_path, "/"), "/", DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR ); } } else { header("HTTP/1.1 503 Service Unavailable.", TRUE, 503); echo "Your common folder path does not appear to be set correctly. Please open the following file and correct this: ".SELF; exit(3); // EXIT_CONFIG } // 定義路徑為常量 define("APP_COMMON", $common_path.DIRECTORY_SEPARATOR);
打開home、admin應(yīng)用的core/Loader.php,修改相關(guān)路徑
注意代碼優(yōu)先級,我的設(shè)置為APPPATH, APP_COMMON,即最優(yōu)先使用APPPATH下的model、libraries, 如果未找到,在APP_COMMON路徑下搜索。
/** * List of paths to load libraries from * * @var array */ protected $_ci_library_paths = array(APPPATH, APP_COMMON, BASEPATH); /** * List of paths to load models from * * @var array */ protected $_ci_model_paths = array(APPPATH, APP_COMMON); /** * List of paths to load helpers from * * @var array */ protected $_ci_helper_paths = array(APPPATH, APP_COMMON, BASEPATH);
修改完成后,在common/model中新建模型文件,前后臺應(yīng)用就可以分別訪問到啦。
最后的問題比較遺憾的是雖然分開了多個應(yīng)用,但是配置文件都是互相獨立,無法實現(xiàn)TP那樣的多層級多優(yōu)先級配置設(shè)置,因為如果你查看config中的配置文件的話,很多配置文件的獲取路徑都是寫死的,例如鉤子類(system/core/Hooks.php)中的100行左右
// Grab the "hooks" definition file. if (file_exists(APPPATH."config/hooks.php")) { include(APPPATH."config/hooks.php"); } if (file_exists(APPPATH."config/".ENVIRONMENT."/hooks.php")) { include(APPPATH."config/".ENVIRONMENT."/hooks.php"); }
相似的有很多配置文件的讀取都是只能在APPPATH的config目錄下讀取,想要重寫這個加載方案的話所要做的改動就太得不償失了,當(dāng)然這并不是CI的缺點,每個工具都有它的設(shè)計理念和使用場合,在實際需求中沒有好壞與否,只說適不適用。
而且,對于對 .htaccess 重寫支持不好的 nginx 來說,這種方式也不太友好。
當(dāng)然這并不影響CI框架的好用和高擴(kuò)展性,你甚至可以修改Loader.php給CI的MVC添加一個service層,只要你愿意的話。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/30610.html
摘要:使用阿里服務(wù)搭建個人網(wǎng)站準(zhǔn)備工作購買云服務(wù)器購買域名下載文件資源阿里云一鍵安裝環(huán)境鏈接提取碼和鏈接提取碼鏈接提取碼鏈接提取碼安裝步驟遠(yuǎn)程登錄主機(jī)中填寫的是你所購買的阿里云的公網(wǎng)。 使用阿里服務(wù)搭建個人網(wǎng)站 準(zhǔn)備工作 1、購買云服務(wù)器 https://www.aliyun.com/produc... 2、購買域名 https://wanwang.aliyun.com/ 3、下載文件資...
摘要:前端打造了前端網(wǎng)站和后臺管理系統(tǒng)。根目錄都是開發(fā)源代碼,根目錄下的文件夾下都是前端網(wǎng)站項目源代碼,根目錄下的文件夾下都是后臺管理系統(tǒng)的源代碼。后臺管理系統(tǒng)使用在根目錄下進(jìn)入項目,安裝包,執(zhí)行命令,啟動服務(wù)瀏覽器打開即可以訪問。 showImg(https://segmentfault.com/img/remote/1460000019603918); 這是個什么的項目? 使用 Node...
閱讀 3258·2021-10-11 10:59
閱讀 2812·2021-10-11 10:58
閱讀 2244·2021-09-04 16:45
閱讀 2717·2019-08-30 15:44
閱讀 671·2019-08-30 15:44
閱讀 3199·2019-08-30 10:51
閱讀 1597·2019-08-29 18:46
閱讀 2749·2019-08-29 13:57