2017-04-05 54 views
0

我目前正在使用lumen創建一個API,我並不完全有信心應該將數據庫查詢放在哪裏。我使用Repository模式,目前我的佈局就像這樣:使用存儲庫模式將Laravel查詢放在哪裏

  1. 控制器加載自定義庫
  2. 庫方法包含雄辯查詢並返回結果。

Controller --> Custom Repository --> Model

Controller <-- Custom Repository <-- Model

- 的我當前如何做一個高層次的代碼示例:

Controller.php這樣

public function browse() 
{ 
    // customRepo added via dependency injection 
    $this->customRepo->browse() 
} 

customRepo.php

public function browse() 
{ 
    // other logic here 
    return Member::where('active', 1)->orderBy('date', 'desc')->get() 
} 

我使用Eloquent來查詢數據庫,目前所有這些調用都發生在Repository中,這對我來說有點奇怪,因爲我的Repositories填充了Eloquent(和一些查詢生成器)查詢我從幾個來源看到它是not correct將查詢放入模型中。

我覺得我現在的方法可能是正確的我只是想看看是否有人可以明確地告訴我哪個是最好的 - 如果沒有,我用自定義方法填充模型沒有太大意義需要。

回答

1

需要考慮的幾點。首先,對術語進行一些澄清。您已經舉例說明的存儲庫模式實際上並不是Repository pattern。這更像是一個Data Access Object pattern。請參閱quentin-starin's answer以瞭解兩者之間差異的簡要說明。其次,MVC體系結構中的模型不僅僅是一個擴展(在這種情況下爲Eloquent的)模型類的類。有很多關於它的文章,但爲了簡潔起見,該模型通常是MVC應用程序的一個組合部分,它處理除了域/業務邏輯之外的數據管理。我將使用術語實體來指代您創建的特定的基於Eloquent的類(例如 - 成員)。鑑於這種理解(對於代碼重用/鬆散耦合/等),在模型中放置任何查詢當然是有益的。但不直接在你的實體中處理數據持久性是一個好主意。剩下的問題是,「我應該如何訪問模型和/或實體?」。

我看到並使用過的一種方法是直接從控制器調用存儲庫/ DAO的方法。爲了可測試性,這通常通過將有問題的實體實例注入到存儲庫類來完成。例如,您的customRepo.php文件中,你可以創建一個類似於下面的內容:

protected $model; 

public function __construct(\App\Member $model) 
{ 
    $this->model = $model; 
} 

public function getActiveMembers() 
{ 
    return $this->model->where('active', 1)->orderBy('date', 'desc')->get() 
} 

另一種方法是通過一個服務層來創建控制器和存儲庫之間抽象的附加層,其中到資源庫中調用/等等。將居住。這個服務層可以是一個地方,可以激發域事件,在數據庫事務中包裝多種數據訪問方法等。我個人的方法是當我認識到他們的需要和/或開始違反SOLID原則時,創建新的抽象層。在那之前,KISS

0

把你的查詢放到版本庫中,就像你在做的一樣,在我看來是正確的,而不是違反了你不應該把查詢放在模型中的想法。換句話說,我覺得你在混合存儲庫和模型的概念。

存儲庫是一袋特定類型的東西,並知道如何存儲和檢索這個包中的物品。

模型包含很少或沒有功能,除了業務邏輯正確處理模型的屬性(計算屬性想到)。