此前,我看過這樣的一個提問「Yii2框架中,有必要再分離service層麼?」,從別人的回答中,本身也收穫了答案,但我以爲還須要有個活生生的粟子,才具備更加清晰明瞭和強有力的說服力。如對個人實戰經歷感興趣的繼續往下看,喜歡的還能夠點擊推薦和收藏。在舉粟子前,我先講講service是什麼?有什麼做用吧?省得還有人糊塗。
一、service是什麼?
在面向OO的系統裏,service就是biz manager,在面向過程的系統裏service就是TS腳本。
二、service有什麼做用?
service層的做用就是把這些須要多個model參與的複雜業務邏輯單獨封裝出來,這些model之間再也不發生直接的依賴,而是在service層內協同完成邏輯。service層的第一個目的其實就是對model層進行解耦。php
一、在Yii2框架中創建service層,專門處理公共且複雜的業務邏輯。segmentfault
一、在common下創建個service層。api
二、部分公共數據處理邏輯(主要的數據處理都寫在這裏)。app
一、在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; } }
二、Controllers裏調用。ide
use common\service\CluesBranchService; $query = CluesBranchService::getIndex();
註釋:這裏返回的是$query,而不是查詢的結果,用過Yii2的都知道列表實現分頁用的是ActiveDataProvider,不須要查出結果,爲了統一塊兒來因此這裏直接返回$query。若有特殊須要加where、andWhere或者獲取數據結果的能夠這樣$query->where(['條件']);$query->all()。ui
以上是一個業務邏輯比較簡單的service層的實現方式,看到這裏可能還有人疑惑,到底應不該該分離service層?
簡單粗暴的總結來講,若是你的某個業務邏輯,須要用到多個model,就放到service層裏面去,若是隻是這個model本身的事,跟其它的model沒有任何關係,放到model裏面就好。
若是你的系統原本就很小,業務邏輯也超級簡單,也不存在長期演進迭代的需求,隨你怎麼高興怎麼寫都行。spa
Yii2框架中,有必要再分離service層麼?:https://segmentfault.com/q/1010000003849810code