這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
序言
此前,我看過這樣的一個提問“Yii2架構中,有必要再分離service層嗎?”,從別人的回答中,自己也收穫了答案,但我覺得還需要有個活生生的粟子,才具有更加清晰明了和強有力的說服力。如對我的實戰經曆感興趣的繼續往下看,喜歡的還可以點擊推薦和收藏。在舉粟子前,我先講講service是什嗎?有什麼作用吧?免得還有人糊塗。
1、service是什嗎?
在面向OO的系統裡,service就是biz manager,在面向過程的系統裡service就是TS指令碼。
2、service有什麼作用?
service層的作用就是把這些需要多個model參與的複雜商務邏輯單獨封裝出來,這些model之間不再發生直接的依賴,而是在service層內協同完成邏輯。service層的第一個目的其實就是對model層進行解耦。
需求分析
1、在Yii2架構中建立service層,專門處理公用且複雜的商務邏輯。
1、在common下建立個service層。
2、部分公用資料處理邏輯(主要的資料處理都寫在這裡)。
程式碼分析
1、在commonservice下寫個CluesBranchService.php檔案,CluesBranchService類繼承本模組主要的models類Chance。凡是關於Chance的公用商務邏輯都往這個檔案裡寫。
namespace common\service;use Yii;use api\modules\v1\models\Sales;use api\modules\v1\chance\models\Chance;/** * //下屬的線索公用資料處理邏輯 */class CluesBranchService extends Chance{ //下屬的線索列表 public static function getIndex() { $SalesModel = new Sales(); $uids = $SalesModel->sevenChild(Yii::$app->user->id); if(count($uids)){ $query = Chance::find()->where(['in','owner_id',$uids]); }else{ $query = Chance::find()->where(['owner_id'=>'-1']); } return $query; }}
2、Controllers裡調用。
use common\service\CluesBranchService;$query = CluesBranchService::getIndex();
注釋:這裡返回的是$query,而不是查詢的結果,用過Yii2的都知道列表實現分頁用的是ActiveDataProvider,不需要查出結果,為了統一起來所以這裡直接返回$query。如有特殊需要加where、andWhere或者擷取資料結果的可以這樣$query->where(['條件']);$query->all()。
分析總結
以上是一個商務邏輯比較簡單的service層的實現方式,看到這裡可能還有人疑惑,到底應不應該分離service層?
簡單粗暴的總結來說,如果你的某個商務邏輯,需要用到多個model,就放到service層裡面去,如果只是這個model自己的事,跟其它的model沒有任何關係,放到model裡面就好。
如果你的系統本來就很小,商務邏輯也超級簡單,也不存在長期演化迭代的需求,隨你怎麼高興怎麼寫都行。
相關資料
Yii2架構中,有必要再分離service層嗎?:https://segmentfault.com/q/1010000003849810