在以前沒有 Service 時,如果要查詢一個 id 爲 1 切 status 爲 1 的數據,而且這段代碼需要重複用到,那麼很多人的第一想法是定義一個方法到 Model 裏面去。因爲在業務中,我們會遇到很多這種事情,然後隨着更新 Model 就會越來越大,大到難以維護,所以我們就需要把 Model 拆分。常規的拆分除了 Service 還有 Repository ,這兩種組合加上去。因爲在業務中,我們但部分時間都是放在查詢的。
Repository 應該做什麼?
Repository ,顧名思義是一個倉庫,原則上是對應的一個 Model ,但是也並不強制,用來專門做查詢,就像前面的業務,就完全可以封裝到 Repository 去。
Service 又應該來做什麼?
顧名思義, Service 即服務,就是用來處理一些複雜的場景和數據整合,比如用戶註冊、用戶登錄、用戶下單、處理三方回調等等這些都可以算作一個複雜的場景。還有數據整合,比如 Dashbroad ,這些地方,爲了代碼複用的最大化,其中的數據應該是由多個小的 Repository 來進行組成的。再有就是由一些 Service 的 Event 的調度。
Controller 應該來做什麼?
- 表單數據驗證
- 對 Service 的各種情況進行處理,理想情況下,Service 中出現的所有非理想結果都應該拋出異常,由 Controller 進行捕獲後處理給用戶。
Model 應該做些什麼?
在像 Laravel 這類框架中,Model 其實要做的有很多。比如:
作用域(scope)
關聯關係(relation)
表屬性(property)
模型事件(model event)
訪問器
、修改器
序列化