CodeIgniter控制器之業(yè)務(wù)邏輯實(shí)例分析
本文實(shí)例分析了CodeIgniter控制器之業(yè)務(wù)邏輯。分享給大家供大家參考,具體如下:
前面分析了公用控制器按模塊分發(fā),方便對(duì)特定模塊的控制,而具體的實(shí)現(xiàn)類則是放在library中。那放在library中是否合適呢?以及控制器中更多的業(yè)務(wù)邏輯該放在哪里?
先說下對(duì)CI中幾個(gè)文件夾的理解
helpers、libraries: 存放一系列輔助函數(shù)、輔助類,用來輔助控制器、業(yè)務(wù)邏輯實(shí)現(xiàn)功能。他們中的方法應(yīng)當(dāng)盡量避免與CI依賴,依賴越緊越難以復(fù)用。以郵件發(fā)送為例,發(fā)送郵件時(shí)很多參數(shù)是不變的,如編碼、協(xié)議、端口等,我們可能會(huì)在config下進(jìn)行配置這些參數(shù),然后library封裝一個(gè)郵件發(fā)送的類,并在其中獲取CI實(shí)例后讀取這些參數(shù)。此時(shí)就出現(xiàn)了與CI實(shí)例的依賴,該類就只能在CI框架中使用,其他系統(tǒng)要用到,就只能重寫了,沒達(dá)到復(fù)用的目的。如果發(fā)送的類只是接收參數(shù),并封裝發(fā)送方法呢?所以說,盡可能的讓helpers、libraries變的簡單,職責(zé)變得單一。
controllers: 控制器目錄??刂破髦饕脕斫庸艹绦?,起到連接的作用。通常情況下,我們會(huì)把業(yè)務(wù)邏輯寫在action中。但隨著業(yè)務(wù)變得復(fù)雜,action代碼將越來越臃腫,難以維護(hù)。
models: 模型目錄。CI的模型的主要職責(zé)就是和數(shù)據(jù)庫打交道,獲取數(shù)據(jù)。很多時(shí)候也會(huì)把業(yè)務(wù)邏輯放在模型中,但業(yè)務(wù)邏輯與模型實(shí)際上是兩種東西了。模型只是獲取數(shù)據(jù),業(yè)務(wù)邏輯可能是把這些數(shù)據(jù)根據(jù)業(yè)務(wù)需要進(jìn)行組合,組合方式可能有很多種,放在模型中會(huì)讓模型難以維護(hù)且不利于復(fù)用。說個(gè)碰到的例子,對(duì)數(shù)據(jù)按一定條件做緩存,獲取數(shù)據(jù)和緩存結(jié)果兩個(gè)流程寫在同一個(gè)方法中,但同樣的數(shù)據(jù)需要做另一種形式的緩存時(shí)發(fā)現(xiàn),獲取數(shù)據(jù)的方法就沒法重用了。
third_party:第三方類庫目錄。拿到一個(gè)類庫后不要直接使用, 可以在library中進(jìn)行一次封裝,讓其更適應(yīng)于系統(tǒng),其他人使用起來難度也會(huì)降低。
可以發(fā)現(xiàn),每個(gè)文件夾都有自己的職責(zé),每個(gè)模塊都有自己的家,都有自己的職能。那業(yè)務(wù)邏輯該怎么辦?
既然這樣, 我們也應(yīng)該給業(yè)務(wù)邏輯安個(gè)家,建立一個(gè)唯一的目錄用來存放業(yè)務(wù)邏輯,暫且命名為service??刂破髦饕?fù)責(zé)接收參數(shù)并調(diào)用service,service來調(diào)用模型,各層各盡其責(zé)。
下面看看怎么實(shí)現(xiàn):
我們可以重寫MY_Load,增加service方法,直接通過
但業(yè)務(wù)邏輯很多都需要獲取CI實(shí)例,這里可以參考模型的方法,core建立一個(gè)MY_Service,其他service均繼承該類,這樣子service里用法就跟控制器里一樣了。
class MY_Service
{
public function __construct()
{
log_message('debug', "Service Class Initialized");
}
function __get($key)
{
$CI = & get_instance();
return $CI->$key;
}
}
其實(shí)主要思路還是需要有一層用來處理業(yè)務(wù)邏輯,java中都有這一層。隨著對(duì)CI的不斷熟悉,發(fā)覺這里需要這一層,達(dá)到解放控制器和模型的目的。和這種類似的做法還有很多,如果系統(tǒng)中有很多地方需要用到web service 或者說cache之類的,其實(shí)也可以按照上面的思路單獨(dú)放在一個(gè)文件夾中處理,方便管理。
更多關(guān)于CodeIgniter相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《codeigniter入門教程》和《CI(CodeIgniter)框架進(jìn)階教程》
希望本文所述對(duì)大家基于CodeIgniter框架的PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
基于php解決json_encode中文UNICODE轉(zhuǎn)碼問題
這篇文章主要介紹了基于php解決json_encode中文UNICODE轉(zhuǎn)碼問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
利用Homestead快速運(yùn)行一個(gè)Laravel項(xiàng)目的方法詳解
這篇文章主要給大家介紹了關(guān)于利用Homestead如何快速運(yùn)行一個(gè)Laravel項(xiàng)目的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
PHP實(shí)現(xiàn)簡單網(wǎng)站訪客統(tǒng)計(jì)的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于PHP實(shí)現(xiàn)簡單網(wǎng)站訪客統(tǒng)計(jì)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
PHP獲取短鏈接跳轉(zhuǎn)后的真實(shí)地址和響應(yīng)頭信息的方法
這篇文章主要介紹了PHP獲取短鏈接跳轉(zhuǎn)后的真實(shí)地址和響應(yīng)頭信息的方法,本文使用get_headers函數(shù)實(shí)現(xiàn),需要的朋友可以參考下2014-07-07
php正則去除網(wǎng)頁中所有的html,js,css,注釋的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猵hp正則去除網(wǎng)頁中所有的html,js,css,注釋的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11

