本文主要介紹了在controller和model中加乙個業務層service,由它來負責業務邏輯,封裝好的呼叫介面可以被controller復用,提高了通用的業務邏輯的復用性,設計到具體業務實現會呼叫model的介面。
大家知道codeigniter框架式mvc分層的,通常大家把業務邏輯寫到controller中,而model只負責和資料庫打交道。
但是隨著業務越來越複雜,controller越來越臃腫,舉乙個簡單的例子,比如說使用者下訂單,這必然會有一系列的操作:更新購物車、新增訂單記錄、會員新增積分等等,且下訂單的過程可能在多種場景出現,如果這樣的**放controller中則很臃腫難以復用,如果放model會讓持久層和業務層耦合。現在公司的專案就是,很多人將一些業務邏輯寫到model中去了,model中又調其它model,也就是業務層和持久層相互耦合。這是極其不合理的,會讓model難以維護,且方法難以復用。
是不是可以考慮在controller和model中加乙個業務層service,由它來負責業務邏輯,封裝好的呼叫介面可以被controller復用。
這樣各層的任務就明確了:
model(dao):資料持久層的工作,對資料庫的操作都封裝在這。
service :
業務邏輯層,負責業務模組的邏輯應用設計,controller中就可以呼叫service的介面實現業務邏輯處理,提高了通用的業務邏輯的復用性,設計到具體業務實現會呼叫model的介面。
controller
:控制層,負責具體業務流程控制,這裡呼叫service層,將資料返回到檢視
view : 負責前端頁面展示,與controller緊密聯絡。
複製**
**如下:
<?php
class my_service
function __get($key)
}複製**
**如下:
<?php
class my_loader extends
ci_loader
return;
}if($service == '' or isset($this->_ci_services[$service]))
if(! is_null($params) && !
is_array($params))
$subdir = '';
// is the service in a sub-folder? if so, parse out the
filename and path.
if (($last_slash = strrpos($service, '/')) !==
false)
foreach($this->_ci_service_paths as $path)
include_once($filepath);
$service =
strtolower($service);
if (empty($object_name))
$service = ucfirst($service);
$ci =
&get_instance();
if($params !== null)
else
$this->_ci_services = $object_name;
return;}}
}(3)簡單例子實現:
控制器中呼叫service :
複製**
**如下:
<?php
class user extends
ci_controller
public function
login()
}service中呼叫model :
複製**
**如下:
<?php
class user_service extends
my_service
public function login($name, $password)
}model中你只跟db打交道:
複製**
**如下:
<?php
class user_model extends
ci_model
public function get_user_by_where($name,
$password)
}基本實現思路就是這樣的。
「讓CI框架支援service層」的那些問題
自己寫了個demo,用php的ci框架,好長時間沒搞了,都忘記了,想新增service層的時候,發現現有網上的code有點問題。其實都不是大問題,注意一下就好了 抄了部分 連線如下 搜尋的結果 都或多或少的不完成 然後整合上述 解決部分問題 注意問題,如下 1,配置 config subclass ...
如何讓Sphinx doc支援MathJax公式
實現這個目的難嗎?一點都不難,但是sphinx是以擴充套件的形式來支援mathjax數學公式渲染的,並且坦白地說,它支援的一點都不好。下面是我自己摸索的操作步驟,花了不少時間,因為中英文 上關於sphinx doc支援mathjax的tutorial基本沒有。1.直接配置外掛程式即可 按照參考資料2...
CI框架支援 GET的兩種實現方法
首先ci框架在2.0以後就支援get了,所以使用毫無壓力!1.使用get傳遞引數的方法 ci會自動將超過uri的兩部分作為引數傳給方法。可以去看手冊 ci框架中文手冊 如下 localhost index.php jb51 func fwsqfdhoa b 那麼控制器中的方法php 如下 www.c...