Service層的是否必要性分析及案例

序言

此前,我看過這樣的一個提問「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

相關文章
相關標籤/搜索