CI工作流程:
所有的入口都從根目錄下的index.php進(jìn)入,確定應用所在目錄后,加載 codeigniter/CodeIgniter.php 文件,該文件會(huì )順序加載以下文件執行整個(gè)流程。
index.php:檢測文件路徑,加載codeigniter.php文件
codeigniter.php: 加載 Common/constants....文件。獲取文件模式、設置計時(shí)器、實(shí)例化類(lèi)(錯誤類(lèi)、擴展類(lèi)、鉤子類(lèi)、系統擴展、配置類(lèi)、編碼類(lèi)、路由類(lèi)、過(guò)程類(lèi)、輸出類(lèi)、安全類(lèi)、語(yǔ)言類(lèi)、控制器)、加載請求方法、渲染輸出view。
CodeIgniter的一個(gè)類(lèi)會(huì )保存為一個(gè)php文件,類(lèi)名與文件名同名,它的核心應用類(lèi)會(huì )在類(lèi)名前加"CI_"。
system/core/common.php:包含檢測php版本、文件權限、加載核心類(lèi)、獲取配置參數、加載異常/錯誤類(lèi)、獲取http請求狀態(tài)等公共函數
application/config/constants.php:設置文件權限常量、應用程序宏定義文件
system/core/Benchmark.php:用來(lái)記錄執行時(shí)間
system/core/Hooks.php:檢測是否有鉤子對象調用
system/core/Config.php:為管理配置文件提供方法,檢測application/config/config.php參數
application/config/config.php:配置全局參數
system/core/URI.php:解析url參數
system/core/Router.php:檢測路由配置,解析 HTTP 請求,以確定誰(shuí)來(lái)處理
system/core/Output.php:檢查是否有緩存文件,如果存在則直接輸出內容。
system/core/Input.php:過(guò)濾 HTTP 請求和任何用戶(hù)提交的數據
system/core/Long.php:初始化提示語(yǔ)言變量
system/core/conctroller.php:控制輸出類(lèi)
引用自:
百度空間記錄錯誤日志:默認程序不記錄錯誤日志,如果有需要的話(huà)可以設置:
1、在application/config/config.php中設置$config['log_threshold'] = 1/2/3/4,如果為0表示不輸出錯誤日志,具體可查看里面的介紹;
2、在需要寫(xiě)入錯誤的頁(yè)面調用全局函數log_message('級別','消息'),級別有三個(gè),一是error,即php運行錯誤,二是debug,系統調試,CI本身在很多頁(yè)面也加了自己的系統debug,三是info,介紹運行中的一些消息,消息內容自己寫(xiě);
3、默認情況下錯誤日志存放在application/logs/log-[time].php中,它按日期存放文件,比如:log-2011-6-26表示存入今天的日志內容,一般情況下為了隱藏日志內容須將這個(gè)地址挪位,可以在$config['log_path']中設置路徑,按要求最好是完整路徑信息。
設置自己的全局變量/配置:有時(shí)需要定義自己的全過(guò)程變量以供在其它地方使用,如自定義的session等,在CI中這項工作也很輕松。
1、在application/config/中創(chuàng )建自己的config文件,注意存放文件位置。比如建立一個(gè)自己的配置文件mysetting.php,內容,$config['try'] = 'this is my trying';
2、在需要調用自定義全局變量的地方使用$this->config->load('settingfile')函數,比如:
$this->config->load('mysetting');
如果有需要也可以通過(guò)application/config/autoload.php設置為自動(dòng)加載。
3、接下來(lái)在同一頁(yè)面中使用$this->config->item('varname')函數,比如:$this->config->item('try');會(huì )輸出:this is my trying;
上面可以看出,CI中函數調用為:$this->filename的形式,也可以看出CI把整個(gè)系統看成一個(gè)大的類(lèi),然后通過(guò)加載、繼承等方式獲取相應方法。
更多自定義變量參考:
http://codeigniter.org.cn/user_guide/libraries/config.html隱藏index.php與加載外部文件:來(lái)自:
百度空間,有更改。
其實(shí)不管是在用CI還是ZF都有同樣一個(gè)問(wèn)題,就是路徑的問(wèn)題。前期,我在用ZF做CMS時(shí),我在.htaccess文件中設置了如遇到j(luò )s,css,img等資源文件都不重定向。但今天在用CI時(shí),卻忘記了,弄了半天都沒(méi)搞好,登陸CI的中國官方網(wǎng),終于在論壇高手的幫助下把問(wèn)題觖決了,在這里把它貼出來(lái),供大家分享。
首先,隱藏url中的index.php文件,這樣訪(fǎng)問(wèn)其它目錄的時(shí)候就不會(huì )有http://www.xxx.com/index.php/xxx的樣式出現,面是直接http://www.xxx.com/xxx形式,在根目錄.htaccess文件里設置(作用是隱藏index.php,有時(shí)index.php可能不在根目錄,則htaccess須移到index.php所在目錄),如下:
RewriteEngine on
RewriteCond $1 !^(index\.php|images|js|css|robots\.txt) #這里排除了images、js、css目錄及index.php、robots.txt文件
RewriteRule ^(.*)$ index.php/$1 [L] 這里JS,CSS,IMG等資源文件夾與SYSTEM文件夾放在同一級下,獨立放置的好處是不用受htaccess的限制,因為htaccess文件寫(xiě)明Deny from all,即拒絕訪(fǎng)問(wèn)。打開(kāi)application/config/config.php改寫(xiě)配置:
$config['base_url'] = "http://127.0.0.1/";
$config['index_page'] = "index.php"; 如果, $config['base_url'] = "http://127.0.0.1";后面沒(méi)加'/',則在model_rewrite最后一行應寫(xiě)
RewriteRule ^(.*)$ /index.php/$1 [L],在index.php前加一個(gè)'/'。然后在JS文件夾中建立ajax.js文件,我在VIEW層中的文件為index.html。這樣我要引入JS時(shí),可以用CI自帶的BASE_URL來(lái)設置,如下:
在controllers里相關(guān)控制網(wǎng)頁(yè)里添加(在其它load之前):
$this->load->helper('url'); 在views表現的index.html里:
<script type="text/javascript" src="http://sumsung753.blog.163.com/blog/<?=base_url().'js/ajax.js'?>"></script> 注:這里url是網(wǎng)站相對URL(好處是可以更改根目錄后相對地址不用改變)
這里js文件夾沒(méi)有重定向,所以可以正常訪(fǎng)問(wèn),而如果是受限制的頁(yè)面則比較麻煩了。
好了,CI中引入外部的JS與CSS就這么簡(jiǎn)單。
注別的說(shuō)明:“ RewriteCond $1 !^(index\.php|images|js|css|robots\.txt) ”這里代碼的意思是:任意你想訪(fǎng)問(wèn)的資源都不被重定向時(shí),都可寫(xiě)在這里。有時(shí),網(wǎng)站沒(méi)有加載CSS,JS(它的路徑都是正確的)時(shí),都是被重定向了,這要注意。
具體可查看CI的中國官論壇
http://codeigniter.org.cn/user_guide/helpers/url_helper.html,URL輔助函數一節,
http://codeigniter.org.cn/user_guide/general/urls.html,url設置,
http://codeigniter.org.cn/forums/thread-4-1-2.html,Hex關(guān)于隱藏index.php的說(shuō)明,但他在model_rewrite用了index\\.php,我覺(jué)得用雙反斜杠有誤。
(另外:特別謝謝CI中國官論壇上的Hex 與visvoy )
數據間的傳輸:1、將數據從控制器傳入視圖
由于控制器controllers在ci中扮演交通警察的角色,其是一個(gè)大類(lèi),而視圖view作為controller類(lèi)中的一個(gè)函數中的函數,所以view可以使用controller中的屬性。所以可以這樣寫(xiě):
Controller類(lèi)Test class Test extends CI_Controller {
public static $test2=''; //定義一個(gè)屬性
public function __construct(){
parent::__construct();
self::$test2 = $this->load->view('new','',true); //給$test2這個(gè)屬性賦值
}
public function index() {
$this->load->helper('url');
$this->load->view('anchor');
}
}
View.php <?php
echo Test::$test2; //直接使用類(lèi)中的值
?>
這種直接使用controllers類(lèi)中的值的方法雖然可行,卻不是ci所提倡的。一般來(lái)說(shuō)在controller中使用$this->load->view()的時(shí)候可以通過(guò)參數傳值給view視圖:
function index()
{
$data['css'] = $this->css;
$data['base'] = $this->base;
$data['mytitle'] = 'Welcome to this site';
$data['mytext'] = "Hello, $name, now we're getting dynamic!";
$this->load->view('testview', $data); //$data通過(guò)參數傳遞到view
}
這里,把需要傳遞的數值加入至$data數組,ci在核心類(lèi)中給自動(dòng)使用extract()函數把數組“解壓”出來(lái),成為一個(gè)個(gè)變量。所以在view中可以直接這樣使用變量:
echo $css;
2、模型與視圖的交互
在ci中模型總是用以處理數據,模型中數據處理也是通過(guò)controller中轉到view,所以最好不要試圖模型直接與視圖聯(lián)系。手冊中有這樣一個(gè)例子:
class Blog_controller extends CI_Controller {
function blog() {
$this->load->model('Blog'); //載入模型
$data['query'] = $this->Blog->get_last_ten_entries(); //使用模型中的方法,將返回值存入$data數組
$this->load->view('blog', $data); //像上例一樣,通過(guò)參數傳給視圖view
}
}