CI TP 對比

CI中一個Model中可以操作多個表,但TP只能一個

首先說Model吧:在TP中是一個表對應一個Model,而且普通Model中只是一些自動驗證啊,自動完成啊、還有數據字段信息啊一些東西;而CI中的Model則完全不同,一個Model不必約束於一個表,也就是說名字爲abc的Model中你也可以查詢名字爲def的表中的數據,而且可以定義方法完成一些數據查詢,比如我可以在名爲articles_model的Model中定義一個名字爲get_articles的方法來獲取所有文章信息,當某個Controller加載了這個Model後,就可以在相應的Controller中用:

$this->articles_model->get_articles();

來方便地獲取所有文章信息,而對於TP來說,這些操作只能在Action類中完成,2.0版的TP已經把View、Relation和Adv三個高級查詢model庫類定爲不自動加載了,看了一下手冊,感覺除了View視圖查詢容易用一點,另外兩個都不怎麼好用,感覺用起來太複雜,還不如用原生的SQL查詢.

CI的Model還有一個使我很喜歡的方法就是dbprefix方法,在使用原生的sql查詢時使用這個函數使得修改數據庫表名前綴後你的代碼不需要經過任何改動,在TP中我沒有發現類似的函數,當我用TP開發一個博客系統時,發現關聯查詢很麻煩,於是想用原生的SQL查詢,卻沒有找到自動增加數據庫表名前綴的方法,雖然可以自己修改TP的核心庫來實現,但是還是覺得這樣有點不太好.

真的要感謝TP,如果不是TP,也許我就不會去關注CI了,當我那天看了幾頁CI的英文文檔後,立馬就對它產生的深厚的興趣,於是第二天一起牀就開始看CI的手冊,雖然是從官網下的英文版的,不過它的手冊寫得很簡潔、很周到,邊看邊操作,看完手冊後我就幾乎能熟練使用這個框架了,於是用它開發了一個博客系統。

CI的Model類簡單易用,TP的Model類功能相對來說要強大一些,但是用起來個人感覺沒有那麼方便。

其次,對於View,從功能上講,TP的View要更加強大一些,選擇更多一些,在TP中你可以選擇就用PHP作模板引擎,可以就用TP自身的模板引擎,也可以選擇用smarty等其它第三方模板引擎,而在CI中就只能用CI內置的功能簡單的模板引擎或者用原生的PHP代碼作模板,個人覺得用PHP作模板更好一些,一來省去了學習另外的模板引擎語法的麻煩,二來執行效率更高一些,因些從View來講,選擇CI或者是TP都無所謂.

再次是Controller了,在CI中的應用的控制器是繼承自核心類Controller的,TP中的控制器則是繼承於核心類Action,不過還是有不同的,在TP中,你可以把一些公共的變量或者在多個控制器中都要執行的東西放在一個action裏,假如這個action文件爲CommonAction.class.php,在它的_initialize方法中可以執行一些在多個控制器中都要執行的代碼或者初始化一些多個控制器都要使用的變量,這樣,應用的其它action只要繼承CommonAction 就可以實現了.

因爲框架在加載相應action時首先會自動加載那個CommonAction的,而在CI中就沒有這個方便的功能了,但是也可以自己寫一個library,在該library類的__construct方法裏放一些代碼,然後在每個控制器中都加載這個library,這樣也可以實現像TP一樣的功能,不過相對來說麻煩了一些,TP還有一點比較靈活的就是,在這個控制器(action)裏面可以執行那個控制器中的函數(比如用A或者R函數來實現),在CI中則不行,你不能在這個控制器中執行那個控制器中的函數,還有就是TP可以定義一個名爲EmptyAction的控制器,當所有控制器都找不到時,就調用這個Empty控制器。

這一點如果與empty方法配合,可以使得URL大大縮減,雖然CI和TP都支持空操作,不過這二者的空操作名稱不相同,實現的優先級也不相同,在TP中的空操作(_empty方法)優先級是最低的,也就是說噹噹前控制器的所有操作都找不到時才調用這個空操作;在CI中則恰恰相反,只要存在空操作(_remap方法),該控制器的其它的操作都沒用了(不能訪問了)

初學CI框架遇到的一些問題,與Thinkphp框架對比的不同之處。

system 是框架核心

application 是項目目錄

index.php 是項目入口文件

其他目錄可以刪除

控制器命名規則

控制器不加 Controller 後綴,

如 user.php 這就是一個控制器

修改默認控制器和方法

默認控制器是welcome.php,不喜歡可以改掉。

修改方法如下:

在 config/routes.php 中

$route[‘default_controller’] = ‘welcome’;

改爲

$route[‘default_controller’] = ‘index/home’;

爲什麼不該成“index/index”呢???

因爲CI中的控制器命名中沒有後綴,所以index類的index方法會默認爲析構方法__construct();

所以不可以這樣搞,如果改成”index/index”則index方法會被調用兩次。

加載視圖文件

$this->load->view(‘index/home’);

這個視圖文件放在/application/view/index/home.php

看到這個文件的後綴了嗎?它是一個php文件,不是html文件

在CI中 view() 方法可以使用多次,也就是可以加載多個模板

可以這樣寫:

1.在 /application/view/index目錄下有這樣幾個模板文件

header.php

main.php

footer.php

2.在index控制器的home方法中
public function home(){
//按順序加載模板文件
this>load>view(index/header); this->load->view(‘index/main’);
$this->load->view(‘index/footer’);
}

給模板分配變量

CI框架中的模板是直接寫php代碼的,如分配一個hello的變量:

$this->load->vars(‘hello’,’heheheh’);

在模板中直接寫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章