Laravel 中設計模式的實戰分享

敲鍵盤的貓發表於2019-02-16

MVC是Laravel自帶的,大家也多少都會用一些。今天我們不談MVC,談一些大中型專案的設計思路。


前言

雖然標題說是設計模式,但是我並不打算去講什麼singleton、strategy、factory,不知道為什麼,每次看到這幾個詞彙,我就昏昏欲睡。我個人認為,在非Java語言中,用這些模式很彆扭。我曾經嘗試過在Unity專案中,使用設計模式,但是總覺得是為了模式而模式,根本不能起到我想要的作用。今天在市圖書館,我很努力的想找到一本在PHP或者Laravel環境下,討論設計模式的書,可是沒找到。

起點

我相信很多人學設計模式,都是跟我一樣,聽說這玩意高大上。但是隻學了前三個,也就是上文那三個,之後的就是在夢中學的了。如何在實戰中能應用上設計模式,我思考了接近兩年。最最禁忌的是,強行在程式碼中使用某個模式,經常會弄巧成拙,還毀了之前的程式碼。最開始我接觸設計模式,出發點就是為了重構程式碼,以便更好的複用和測試。但是直到最近,也就是寫上一篇部落格的不久前,我才明白到底該怎麼做。

上路

Laravel中自帶MVC,但是我目前的專案已經突破一萬行,MVC早已不堪重負。後來我決心去找一些架構設計,重新整理一下程式碼,順利的找到了這個淺顯易懂的blog,裡面附帶三篇獨立的文章,分別講解了三種模式:Service、Repository、Presenter。不過我實在太笨了,這樣都理解不了,一開始強行去寫,寫著寫著,才慢慢理解。過程中發現了Laravel-5.3-Repository,用命令列建立repository檔案,稍加修改可以改出一份建立service檔案的命令。以及laravel-auto-presenter,可以直接將presenter物件注入到model中,當做model原有屬性的替代品(比如重寫預設的icon屬性,附加上img標籤等)。但是這個庫不支援自定義函式,只能用來替換以後屬性。最後還有這個庫laracasts/presenter,這個是我目前在用的,以trait模式使用,通過呼叫$foo->present()->customContent()來使用,只能呼叫自定義函式,不支援重寫已有屬性。

終點?

今天寫著寫著,突然有所感悟。都說repository模式可以方便測試,我現在才明白具體要怎麼做。在controller或者sevice中呼叫repository的時候,一定要把變數在呼叫的時候傳入,這樣後續可以寫單元測試,只通過變數就能測試repository是否正確,而不用每次都通過request傳入引數來測試。也就是說repository基本是被當成一組靜態函式使用的。

拋磚引玉,希望大家都能討論下,在具體專案中都是怎麼設計的,我也在學習的階段,歡迎回復交流。

相關文章