iT邦幫忙

0

關於Laravel Service & Repository的設計模式

  • 分享至 

  • xImage

大家好,這是我首次發問。

我對於我們即將面對的改變有一些疑問,希望有經驗的大家可以給我一些指點。

我們的公司計劃更改現行的開發模式,並打算導入Laravel框架並與現有公司框架並行。
而我將會是主要負責laravel的人,之後如果其他人也會把我的案子當範本使用,因為公司內其他人都是寫原生php。
因此我也沒人可以討論...所以上來詢問!

我預計會在原本MVC價購基礎上加入Service和Repository的設計模式。
以下是我會創建的檔案:

Services\BaseService.php

Services\AddDataService.php

Services\DeleteDataService.php
上述檔案將繼承BaseService類別。

Repositories\BaseRepository.php

Repositories\ModelRepository
這裡的"Model"是多個以Model命名的Repository。
上述檔案將繼承BaseRepository類別。

預計的程式碼如下:

class XXXXRepository extends BaseRepository
{
    protected $XXXX;

    public function __construct(XXXX $XXXX)
    {
        $this->model = $XXXX;
    }
}

因為我們將在後台使用圖片和文字來上架和刪除各個頁面,所以我打算在BaseService中一次性地注入數個ModelRepository。
程式碼如下:

class BaseService
{
    protected $XXXXRepo;
    protected $OOOORepo;
    protected $AAAARepo;
    protected $BBBBRepo;
    
    public function __construct(
        XXXXRepository       $XXXXRepo,
        OOOORepository       $OOOORepo,
        AAAARepository       $AAAARepo,
        BBBBBRepository      $BBBBBRepo
        
    ){
        $this->XXXXRepo    = $XXXXRepo;
        $this->OOOORepo    = $OOOORepo;
        $this->AAAARepo    = $AAAARepo;
        $this->BBBBRepo    = $BBBBRepo;
        
    }

}

這樣的設計可以讓我方便地在每個Service中使用這些Repository,程式碼如下:

class AddDataService extends BaseService
{

    public function addXXXX(Request $request, $id)
    {
        $data = $this->XXXXRepo->create([
            //略            
        ]);
    }

    public function addOOOO(Request $request, $id)
    {
        $data = $this->OOOORepo->create([
            //略            
        ]);
    }

    public function addAAAA(Request $request, $id)
    {
        $data = $this->AAAARepo->create([
            //略            
        ]);
    }

    public function addBBBB(Request $request, $id)
    {
        $data = $this->BBBBRepo->create([
            //略            
        ]);
    }
}

想詢問一下這樣會不會讓BaseService過度肥大進而影響效能之類的,
因為我的想法是想說創建AddDataService讓他只負責處理新增資料的工作,
但一次性注入一堆Repo後,DeleteDataService也要再做一次,
不如寫在BaseService內讓所有Service都可以一次繼承,
之後即使有單獨的Service也可以直接使用對應的Repo

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
sharkhead
iT邦新手 5 級 ‧ 2023-06-05 18:10:21

感覺你的 AddDataService 有點包山包海,但良好的設計應該根據業務邏輯拆開

例如拆成 AddCustomerDataServiceAddProductDataService,所以 AddCustomerDataService 應該就只會用到 CustomerRepository (或是其他有相關的 Repository,不一定只會有一個)

此外我個人不建議用"動作"來作為切 Service 的基準,應該是以對應的業務範圍來切分

以剛剛的 AddCustomerDataServiceDeleteCustomerDataService 為例,我會覺得合併到 CustomService 會比較好一些

class CustomService
{
    public function __construct(
        protected CustomRepository $repository
    ) {}
    
    // add data
    public function create(Request $request)
    {
        $this->repository->create('...')
        
        // ...
    }
    
    // delete data
    public function destroy(Request $request, Customer $custom)
    {
        $this->repository->destroy($custom->id)
        
        // ...
    }
}

以上小弟淺見,供大大參考

imyi iT邦新手 5 級 ‧ 2023-06-07 21:37:11 檢舉

很感謝你的回答XDD
我也覺得我的addDataService有點包山包海,
但我還想再請教一下,
我在BaseService 裡面一次性寫入Repository這樣合適嗎?
我想說這樣所有的Service 只要繼承就好了
不知道會不會有效能上的問題??

我要發表回答

立即登入回答