[codeigniter 二]、分析CI結構和CI是如何工作的

一、CI的文件結構

大家還記得第一講中的CI目錄結構圖嗎,當時並沒怎麼詳細說明,我們再來看一下。

根據上圖我們可以知道,CI主要組成部分爲,application(應用文件夾)system(系統文件夾)index.php入口文件


應用文件夾中主要是存放控制器、模型和視圖等,系統文件夾中主要是存放組成CI的核心文件的,index.php入口文件是一個單一入口文件,所謂單一文件是指在一個網站(應用程序)中,所有的請求都是指向的這麼一個文件,由它負責接收並處理URL中的控制器和方法。換句話說, 它調用一個 '控制器', 然後返回一個'視圖'。

具體對單一入口文件的介紹我引用了高洛峯老師在BroPHP中對它的一個解釋。如下:

單一入口文件:
在使用PHP過程化編程時,每個PHP文件都能獨立訪問並運行,就像一個體育場有多個入口一樣,需要在每個入口都要檢票和安全檢查。而採用單一入口模式進行項目部署和訪問,無論完成什麼功能,一個項目只有一個統一(但不一定是唯一)的入口,就像一個體育場如果只能從一個入口入場(程序是抽象的,一個入口和多個入口效率是一樣的)控制起來則更靈活,幾乎沒有什麼缺點。使用主入口文件部署項目的優點如下:

1、加載文件方便
在編寫和閱讀過程化程序代碼時,經常會遇到文件之間互相包含,其中包括PHP使用include包括函數庫和公共資源文件,也包括在HTML中使用<link>和<script>加載CSS和javaScript文件。項目越大,文件越多越讓人感覺頭疼,就像一張大網一樣將文件交織在了一起,不容易找到頭緒。而使用單一入口則解決這個難題,在項目應用中用到的任何一個文件,只要相對於單一入口文件的位置查找即可。


2、權限驗證容易
如果每個PHP文件都可以獨立訪問,在做用戶權限驗證時就需要對每個文件進行判斷。而採用單一入口則只需要在一個位置進行判斷即可。

3、URL重寫簡單
如果每個PHP文件和不同目錄下的PHP文件都可以獨立訪問,則在Web服務器中對URL進行重新編寫時需要很多條規則。而採用單一入口則在URL重寫時只需要簡單的幾條規則即可。



好,接着來具體看application(應用文件夾)、system(系統文件夾)中放了哪些文件以及它們的作用是什麼吧。

application :
            cache          第一次安裝時爲空,如果你打開緩存設置,這個目錄存放緩存數據
            config         存放配置文件,包含網站的基本配置信息
            controllers    存放你項目的控制器目錄

            core           該目錄可以擴展系統的核心文件
            errors         包含出錯信息頁,你不必修改這個目錄
            hooks          首次安裝時爲空,用來存放你創建的鉤子。鉤子是 用來裝載其它文件的控制方法

            helpers        輔助函數,你可以對系統的輔助函數進行擴展
            language       存放你本國語言的文件目錄
            libraries      類庫,你可以創建自己的類庫
            logs           如果你設置打開了系統的錯誤日誌,日誌文件就默認保存在這個目錄
            models         存放你項目的模型目錄
            views          存放視圖的模板目錄


system :            
           core            存放系統核心文件
           database        CI框架的數據庫類的類庫文件
           fonts           沒有在用戶手冊中介紹,存放水印圖像使用的字體

           helpers         輔助函數,你可以對系統的輔助函數進行擴展
           language        存放英語的文件目錄
           libraries       存放一些類庫的目錄,比如SESSION類、分頁類、圖像類等


應用文件夾(application)中,最重要的文件夾是config,該文件夾內有兩個需要關注的文件:config.php 和 database.php。
,其次是controllers、models和views文件夾,分別存儲你網站中的控制器、模型和視圖。

愛問問題的你可能會納悶CI爲什麼要這樣來設置文件結構,其實啊,爲什麼要把代碼放在這個目錄而不是那個目錄是沒有什麼理由好講,這就是CI裏的一種約定。

另外細心的你是不是又發現application和system有些文件夾是相同的呢,如core、helpers、libraries等。其實這也是由CI結構約定的, 當你裝載一個輔助函數helper, 或類庫文件library, CI會在上述兩個目錄中查找,比如你要裝載一個類叫做無限分類的類Category, CI會先查找application/libraries目錄。如果這個目錄中不存在,CI會尋找system/libraries目錄。這意味着可以通過把同名的文件放入application目錄來取代CI核心庫的libraies, helpers。但不要輕易嘗試這樣做,因爲這種高度的靈活性需要你擁有足夠多的CI使用經驗。

二、CI的是如何工作的

上一節我們快速的搭建好了一個CI網站,瀏覽器成功的顯示出一個歡迎界面。我們不禁要問那究竟是如何顯示出來的呢?其實根據我們前面對CI的介紹和結構分析之後,我們不難發現這跟CI使用M-V-C模式和單一入口文件有關。

我們來簡單分析一下:

例如當我們訪問http://localhost/ci_demo/index.php的時候,程序會依靠index.php來做大量的初始化工作,調用大量的基礎類庫,並根據index.php後面的參數來加載控制器和方法,然後調用模型,加載視圖等內容信息。當然在這個例子當中index.php後面你並沒有看到任何參數,但這不代表就沒有參數存在,因爲CI事先已經默認指定好了控制器和方法的參數,這個默認的參數可以自己指定,配置文件存放在application/config/routes中,該配置文件中包含下列設置:

$route['default_controller'] = "welcome";$route['404_override'] = '';上述config文件,默認的控制器爲welcome,如果沒有指定方法,index方法會被默認指定。如果請求的控制器或方法不存在,則程序會轉到“404”頁面。結果如圖所示:


另外需要進一步說明的是上述URL中方法(也稱爲函數)必須是前面那個控制器中存在的。或則說,你不能夠在一個控制器內調用其它控制器內的方法。

我們來總結一下CI處理URL的具體細節(部分摘自CI中國論壇):

假如URL網址爲:http://yoursite/index.php/control/func/param1/param2/...


URL片段
用途
http://www.yoursite.com

定位你網站的基本URL
/index.php

定位CI路由器並讀取URL的其它部分,分析後定們到相關網頁
/control

CI將調用的控制器的名稱(如果沒有設置控制器名稱,CI將調用你在config文件中設置的默認控制器)
/func

CI將調用的函數的名稱,位於所調用的控制器內。(如果不存在該函數,默認調用的是index函數,除非你使用_remap)
/param1

CI把這個作爲傳遞給函數的變量
如果還有/param2/...

CI把更多的參數作爲變量傳遞給函數

所以上面網址可以理解爲:http://localhost:port/index.php/控制器名/方法名/方法的參數1/方法的參數2/...
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章