最近隨著業(yè)務的不斷發(fā)展,越來越復雜的邏輯交織在一起使得原來的代碼很難維護,同一個類似的邏輯在多個地方調(diào)用,每次邏輯變更的時候非常容易忘記改其中的一處地方。所以需要抽出一個服務層來處理業(yè)務。
在app目錄下單獨創(chuàng)建了service文件夾來存放所有的服務。根據(jù)大的業(yè)務又分成了不同的子文件夾,針對每個大模塊創(chuàng)建對應的工廠類,以便于后期調(diào)用的時候能夠方便調(diào)用,不需要到不同文件夾找對應的類名。

隨意找其中的一個例子來敘述下,比如說訂單的OrderService.php:
class OrderService
{
/**
* 錄入訂單
* @param $obj
* @return bool
*/
public function add($obj)
{
******
}
/**
* 獲取某一個訂單對象
* @param $id
* return mixed
*/
public function getById($id)
{
******
}
/**
* 獲取某一個訂單對象
* @param $orderSn
* return mixed
*/
public function getByOrderSn($orderSn)
{
******
}
/**
* 獲取訂單數(shù)組
* @param $idArr [3,4,5]
* @return mixed
*/
public function getArrByIdArr($idArr)
{
******
}
/**
* 更新訂單狀態(tài)
* @param $id
* @param $state
* $return void
*/
public function updateState($id, $state)
{
******
}
這里是訂單相關最基礎的幾個服務,訂單服務類提供的服務基本滿足幾個條件,盡量原子化,粒度盡量小,這樣能夠更好的解耦,當然強數(shù)據(jù)一致性的功能可以放在一起。比如更新訂單狀態(tài)這個功能,可以同時更新訂單明細的狀態(tài)耦合在一起,因為這是非常強數(shù)據(jù)相關的功能。
這樣在原來的Controller里面只需要調(diào)用Service層的服務即可,不需要直接使用Model操作數(shù)據(jù)庫,這樣的好處就是功能復用,以及避免復雜Sql大家寫錯,因為Laravel&Lumen框架的Orm是比較強大的,非常容易寫錯??紤]到一些業(yè)務層面的服務提供,對于每個模塊又有一個Trait,把一些可復用的業(yè)務功能合并在一個方法中,這樣在不同的地方都可以共同調(diào)用。同時在未來業(yè)務更改的時候,只需要修改Trait中對應的方法即可,代碼維護性非常高。
trait ShipStatic
{
public function orderShip($order, $express, $expresses, $expressNumber)
{
// 獲取當前所有需要的服務
******
// 錄入第一條必填快遞信息
******
// 錄入后面可選快遞信息
******
// 計算訂單自動收獲時間
******
// 更新訂單
******
// 更新訂單明細
******
// 更新流水
******
// 通知用戶信息
******
}
}
Trait中就可以類似于這么寫,這樣所有地方都可以復用,實現(xiàn)代碼封裝。
大家喜歡可以訪問我的個人網(wǎng)站:http://www.yingminxing.com
如有疑問,歡迎溝通交流:QQ:370399195, 微信:yingminxing1988