Laravel 項目開發(fā)規(guī)范 Service 模式

2023-02-16 17:12 更新

介紹

項目中的大部分業(yè)務(wù)邏輯,都應(yīng)該封裝到 Service 層。這不僅能更好地組織代碼,還方便單元測試。

ModelService

Model 的操作,涉及到業(yè)務(wù)邏輯的,絕不放置于控制器方法或模型文件中。

控制器方法只處理請求邏輯。模型只處理模型定義,以及數(shù)據(jù)關(guān)聯(lián)邏輯。

業(yè)務(wù)邏輯必須封裝到對應(yīng)的 ModelService 類中。

例如 LearnKu.com 的 Reply 模型,用戶發(fā)布 Reply 時需要的邏輯,如發(fā)送通知給話題的作者,或者增加話題的評論數(shù)等操作,放置于 ReplyService 類的 create 方法。

ModelService 方法命名

必須參照 Laravel Model 的方法來命名,如:

$reply_service->create();
$reply_service->all();
$reply_service->update();
$reply_service->delete();

其他 Service

其他類型的類,都應(yīng)該使用 Service 來封裝,例如說:

  • 請求第三方接口的類(SendCloudService)

  • 圖片處理的工具類(ImageService)

  • 包含業(yè)務(wù)邏輯的類(對 Elasticsearch 封裝的 SearchService )

存放目錄

所有的 Service 類都必須存放于 app/Services 目錄中(注意是復(fù)數(shù))。

目錄組織

應(yīng)該避免直接將 Service 類放置于 app/Services 目錄下,應(yīng)該考慮通過業(yè)務(wù)邏輯,將其歸類于子目錄中。如:

Auth —— 存放登錄、授權(quán)相關(guān)的 Service;
Payment —— 存放支付相關(guān)的 Service;
Book —— 存放課程相關(guān)的 Service.

Service 方法無狀態(tài)

必須 做到 Service 類無狀態(tài)。

無狀態(tài)意味著是無論在控制器方法、命令行、測試代碼中,皆可調(diào)用。

? 錯誤的例子:

// CommentService
public function create($content)
{
    return Comment::create([
        'content' => $content,
        'user_id' => Auth::user()->id
    ]);
}

// PostService
public function update(Request $request)
{
    return $this->comments()->create([
        'content' => $request->get('content'),
        'category_id' => $request->category_id
        'user_id' => Auth::user()->id
    ]);
}

?正確的例子

// CommentService
public function create($content, $user)
{
    return Comment::create([
        'content' => $content,
        'user_id' => $user->id
    ]);
}

// PostService
public function create($content, $category_id, $user)
{
    return Post::create([
        'content' => $content,
        'category_id' => $category_id,
        'user_id' => $user->id
    ]);
}


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號