美文网首页
l5-repository 非原创

l5-repository 非原创

作者: 高校邦MOOC | 来源:发表于2017-07-10 16:49 被阅读64次

初學者學習 Laravel 時分兩種,一種是乖乖的將程式填入 MVC 架構內,導致 controller 與 model 異常的肥大,日後一樣很難維護;一種是常常不知道程式該寫在哪一個 class 內而猶豫不決,畢竟傳統 PHP 都是一個頁面一個檔案。本文整理出最適合 Laravel 的中大型專案架構,兼具容易維護、容易擴充與容易重複使用的特點,並且容易測試。

Version
Laravel 5.3
Controller 過於肥大
受RoR的影響,初學者常認為 MVC 架構就是 model, view, controller:

Model 就是資料庫。
Controller 負責與 HTTP 溝通,調用 model 與 view。
View 就是 HTML。

假如依照這個定義,以下這些需求該寫在哪裡呢?

  1. 發送 Email,使用外部 API。
  2. 使用 PHP 寫的邏輯。
  3. 依需求將顯示格式作轉換。
  4. 依需求是否顯示某些資料。
  5. 依需求顯示不同資料。

其中 1, 2 屬於商業邏輯,而 3, 4, 5 屬於顯示邏輯,若依照一般人對 MVC 的定義,model 是資料庫,而 view 又是 HTML,以上這些需求都不能寫在 model 與 view,只能勉強寫在 controller。
因此初學者開始將大量程式寫在 controller,造成 controller 的肥大難以維護。
Model 過於肥大
既然邏輯寫在 controller 不方便維護,那我將邏輯都寫在 model 就好了?
當你將邏輯從 controller 搬到 model 後,雖然 controller 變瘦了,但卻肥了 model,model 從原本代表資料庫,現在變成還要負擔商業邏輯與顯示邏輯,結果更慘。
Model 代表資料庫嗎?把它想成是 Eloquent class
就好,資料庫邏輯應該寫在 repository 裡,這也是為什麼 Laravel 5 已經沒有 models
目錄,Eloquent class 僅僅是放在 app
根目錄下而已。
中大型專案架構
那我們該怎麼寫呢?別將我們的思維侷限在 MVC 內 :
Model : 僅當成 Eloquent class。
Repository : 輔助 model,處理資料庫邏輯,然後注入到 service。
Service : 輔助 controller,處理商業邏輯,然後注入到 controller。
Controller : 接收 HTTP request,調用其他 service。
Presenter : 處理顯示邏輯,然後注入到 view。
View : 使用 blade 將資料 binding 到 HTML。

別害怕在 Laravel 預設目錄以外建立的其他目錄,根據 SOLID單一職責原則,class 功能越多,責任也越多,因此越違反單一職責原則,所以你應該將你的程式分割成更小的部分,每個部分都有它專屬的功能,而不是一個 class 功能包山包海,也就是所謂的萬能類別,所以整個專案不應該只有 MVC 三個部分,放手根據你的需求建立適當的目錄,並將適當的 class 放到該目錄下,只要我們的 class 有 namespace 幫我們分類即可。
Repository
由於篇幅的關係,將 repository 獨立成專文討論,請參考如何使用 Repository 模式?
Service
由於篇幅的關係,將 service 獨立成專文討論,請參考如何使用 Service 模式?
Presenter
由於篇幅的關係,將 presenter 獨立成專文討論,請參考如何使用 Presenter 模式?
單元測試
由於現在 model、view、controller 的相依物件都已經拆開,也都使用依賴注入,因此每個部分都可以單獨的做單元測試,如要測試 service,就將 repository 加以 mock,也可以將其他 service 加以 mock。
Presenter 也可以單獨跑單元測試,將其他 service 加以 mock,不一定要跑驗收測試才能測顯示邏輯。
Conclusion
本文談到的架構只是開始,你可以依照實際需求增加更多的目錄與 class,當你發現你的 MVC 違反 SOLID 原則時,就大膽的將 class 從 MVC 拆開重構,然後依照以下手法 :

  1. 建立新的 class 或 interface。
  2. 將相依物件依賴注入到 class。
  3. 在 class 內處理他的職責。
  4. 將 class 或 interface 注入到 controller 或 view。

最後搭配單元測試,測試重構後的架構是否與原來的需求結果相同。

本文非原创,只是记录大牛的言论供自己学习,反复研读!

相关文章

  • l5-repository 非原创

    初學者學習 Laravel 時分兩種,一種是乖乖的將程式填入 MVC 架構內,導致 controller 與 mo...

  • l5-repository 组件 -- Generator 生成

    安装和生成配置文件参看 l5-repository 组件 config/repository.php 配置文件参数...

  • 非原创

    美有定论吗?不清楚,只知道一千次凝视她会有一千零一次发现。以至于能美到什么程度已经并不重要,重要的是进一寸有一寸的欢喜。

  • 非原创

    最是田园好,烦愁都忘了。 小桥流水炊烟袅,黄牛牧童萧。 东篱桂花开正早,万亩白莲黄金稻, 远近高低风光妙。客闲棋子...

  • 非原创

    成功取决于你的认知、态度、行动。 01 永远不要自毁机会和前途 02 昨天很美好,今天很残酷 明天又是新的开始,但...

  • 非原创

    墙角幽然而生的暮色爬上窗口 窗外黄昏一如旧年温柔 浮云变幻 曾经看不见终点的长路终于走到了尽头 时光如有质感—— ...

  • 非原创

    你坚持你自己。在时光隧道里,优雅而笃定地低沉着。从此岸到彼岸,从此生到彼生。不管时光如何蹉跎,你依旧坚持自己的形式...

  • 非原创

    【非我族类,其心必异】 他们遇见的时候她还很小,她只记得是在一个空阔的荒野里,那个时候他手中拿着一个酒葫芦面上带着...

  • 非原创

    “春节了,医院放假吗?” 我们的回答是:“地球不爆炸,我们不放假,宇宙不重启,我们不休息,风里雨里节日里我们都在这...

  • 非原创

    今天有两个坏消息: 一是德国有5名中国籍学生被确诊,已经通知家长,但相隔万里,父母现在肯定哭死了,希望孩子们能早日...

网友评论

      本文标题:l5-repository 非原创

      本文链接:https://www.haomeiwen.com/subject/mscuhxtx.html