CI框架網(wǎng)站前后臺目錄搭建

我的博客原文地址 http://www.qinblog.net/Article/article/5

前臺與后臺

根據(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框架擴(kuò)展

1、Loader.php代碼分析

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文件夾中,依次修改即可完成核心類的替換。

2、共享路徑的實現(xiàn),定義常量

要實現(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)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,094評論 25 709
  • application:具體項目開發(fā)目錄; system:CI框架代碼; user_guide:用戶手冊,和實現(xiàn)無...
    依點矯情閱讀 1,955評論 0 5
  • [程序運作流程]下圖說明了整個系統(tǒng)的數(shù)據(jù)流程: CodeIgniter 程序流程 index.php 文件作為前端...
    聰少Jeff閱讀 781評論 0 4
  • 開發(fā)中所涉及的屏幕適配無非2種,控件大小的適配和字體大小的適配。 1. 控件大小的適配 1.1 豎屏下的宏,用來設(shè)...
    何以_aaa閱讀 2,278評論 0 0

友情鏈接更多精彩內(nèi)容