摘要:在不影響個月現(xiàn)有代碼的情況下,通常不會輕易改變項目架構(gòu)。此示例顯示模塊通過文件夾提供,同時仍通過控制臺提供命令。另一方面,則僅提供,并且依賴倉庫值對象以及服務(wù)類來提供更大的數(shù)據(jù)價值。
轉(zhuǎn)自 PHP / Laravel 開發(fā)者社區(qū) https://laravel-china.org/top...
我非常喜歡編寫基于模塊化設(shè)計的軟件和編程方式,但我不太喜歡依賴第三方軟件包和類庫來處理一些瑣碎的事情,因為它們不會讓你的編程水平得到很好的提升。所以這兩年來,我一直在用Laravel編寫基于模塊的軟件,現(xiàn)在我對這個結(jié)果非常滿意。
推動我走向基于模塊化設(shè)計的軟件和編程方式的決定性因素是我想持續(xù)提升我的編程水平。想象一下,你構(gòu)建了一個項目結(jié)構(gòu),6個月后你發(fā)現(xiàn)這個項目存在很多bug。在不影響6個月現(xiàn)有代碼的情況下,通常不會輕易改變項目架構(gòu)。在分析這個項目時,我注意到了兩個要點:你要么在整個項目中都有一個標(biāo)準(zhǔn),要么堅持下去,要么模塊化并逐個模塊地改進(jìn)。
有些人傾向于不惜一切代價、固守標(biāo)準(zhǔn)地開發(fā),即使這可能意味著要堅持一個你不再喜歡的標(biāo)準(zhǔn)。就我個人來言,我更喜歡持續(xù)地改進(jìn),若是第 20 個模塊和第 1 個模塊寫得完全不一樣也沒關(guān)系。如果某天我需要回到模塊 1 修復(fù) BUG 或重構(gòu),我可以將其改進(jìn)為第 20 個模塊使用的最新標(biāo)準(zhǔn)。
假設(shè),你也像我一樣喜歡基于模塊化開發(fā) Laravel 應(yīng)用、盡可能避免在項目中添加不必要的第三方依賴——本文是我的一點經(jīng)驗。
1- 路由服務(wù)提供者Laravel 路由系統(tǒng)可以說是整個應(yīng)用的入口。首先需要修改的是默認(rèn)的 RouteServiceProvider.php 文件,它應(yīng)當(dāng)將現(xiàn)有路由模塊化。
mapModulesRoutes(); } protected function mapModulesRoutes() { // 如果你在編寫傳統(tǒng) Web 應(yīng)用而非 HTTP API,請使用 `web` 中間件。 Route::middleware("api") ->group(base_path("routes/modules.php")); } }
如上,我們可以直接擺脫該文件的整個樣板,只需設(shè)置一個模塊化的路由文件即可。
2- 模塊文件Laravel 在?routes?文件夾中自帶了一些文件。由于我們已經(jīng)不在 RouteServiceProvider 中映射這些路由,所以可以直接刪除它們。接下來,我們創(chuàng)建一個 modules.php 路由文件。
3- Books 模塊在?app?文件夾中,創(chuàng)建?Modules/Books/routes.php 文件。在此文件中,我們可以定義該應(yīng)用 Books 模塊的路由規(guī)則。
你可以使用基于控制器——也就是 Laravel 中默認(rèn)標(biāo)準(zhǔn)的路由方式,但我個人更喜歡 Good bye controllers, hello Request Handlers(放棄控制器,采用請求處理器)?的方式。 如下是 ListBooks 的實現(xiàn)。
paginate()); } }以上代碼中 BookResource?是 Laravel 的資源轉(zhuǎn)換層。按照官方對于命名空間的建議,我們可以在 app/Modules/Books/Resources 文件夾中創(chuàng)建它。
$this->resource->id, "title" => $this->resource->title, ]; } }4- Authors 模塊我們還可以通過 Routes 文件來啟動 Authors 模塊。
注意: ?app/Modules/Authors 這個命名空間正表示我們所編寫的文件,對于請求處理程序來說也是非常簡單的。
paginate()); } }最后,我們將編寫的 Resource 類轉(zhuǎn)變?yōu)轫憫?yīng)式的 JSON 格式。
$this->resource->id, "name" => $this->resource->name, "books" => $this->whenLoaded("books", function () { return BookResource::collection($this->resource->books); }) ]; } }注意資源是如何進(jìn)入另一個模塊以重用 BookResource 。 這通常不是一個比較好的選擇,因為模塊應(yīng)該是完全自給自足的,并且只能重用標(biāo)準(zhǔn)類,例如 Eloquent Models 或設(shè)計用于在任何模塊上通用的通用的組件。 這個問題的解決方案通常是將 BookResource 復(fù)制到 Authors 模塊中,從而可以在不使用另一個模塊的情況下進(jìn)行更改,反之亦然。 我決定保留這個跨模塊的用法,這個例子表現(xiàn)出一個很好的經(jīng)驗方法,就是讓模塊之間彼此隔離,但是如果你認(rèn)為上面的例子很簡單并且不太可能帶來任何問題。 始終確保編寫測試以涵蓋您編寫的功能,以避免其他人在不知不覺中修改您的應(yīng)用程序。
5- 結(jié)語雖然這是一個非常簡單的例子,但我希望它能夠讓人們根據(jù)自己的需要來輕松操作使用 Laravel 框架的結(jié)構(gòu)標(biāo)準(zhǔn)。您可以非常輕松地更改文件的位置,以便構(gòu)建基于模塊化的應(yīng)用程序。我的大多數(shù)項目都附帶了 App / Components 模塊,可以適用于任何模塊可重用的泛類型的基礎(chǔ)類;?App / Eloquent ,Modules 文件夾可以用于保存 Eloquent 模型和數(shù)據(jù)庫關(guān)系模型,我們可以在其中構(gòu)建任何基于模塊化的功能。 這是我最近開始研究的應(yīng)用程序的文件夾目錄結(jié)構(gòu):
我希望每個人都能從中得到這個概念,每個模塊都有自己的需求,并且可以擁有自己的文件夾/實體/類/方法/屬性。沒有必要將所有模塊標(biāo)準(zhǔn)化完全相同,因為某些模塊比其他模塊簡單得多,并且不需要大量的結(jié)構(gòu)設(shè)計。此示例顯示AccountChurn模塊通過 HTTP 文件夾提供 API,同時仍通過控制臺提供 Artisan 命令。另一方面,AccountOverview則僅提供 HTTP API,并且依賴倉庫、值對象(bags)以及服務(wù)類(paginators)來提供更大的數(shù)據(jù)價值。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/29933.html
摘要:項目背景硬件架構(gòu)采用,應(yīng)用程式使用的進(jìn)行配置管理隨著業(yè)務(wù)的迭代越來越多的配置被寫入文件,變得越來越臃腫,管理起來也不方便。使用守護(hù)進(jìn)程,支持秒級獲取配置,后續(xù)可擴展為消息訂閱。架構(gòu)圖基于開發(fā)擴展,配置中心與客戶端通信基于系統(tǒng)拆分為個,包包。 項目背景 硬件架構(gòu)采用Nginx + SLB,應(yīng)用程式使用 Laravel 的 .env 進(jìn)行配置管理 ,隨著業(yè)務(wù)的迭代越來越多的配置被寫入 .e...
摘要:前言想想也已經(jīng)做過不少架構(gòu)的項目了,有基于,基于,基于,基于的。好了,介紹完畢,接下來,我就從零開始,一步一步建起前后端完全分離的前端架構(gòu)了。 前言 想想也已經(jīng)做過不少架構(gòu)的項目了,有基于vue,基于react,基于thinkPHP,基于laravel的。 做多了,也就對現(xiàn)有的架構(gòu)有各種想法,有好的,有壞的,總之,用起來還是不爽。vue-cli雖然可以很快地構(gòu)建并使用,尤其是vue-c...
摘要:服務(wù)端架構(gòu)代碼源碼部署說明現(xiàn)有基于框架開發(fā),本次介紹也針對。如接口名,對應(yīng)的類文件及類名為接口命名規(guī)范命名字母按功能或模塊從大到小劃分,依次編寫如后臺用戶修改密碼字母最后單詞為操作。 API服務(wù)端架構(gòu)代碼 源碼 http://flc.ren/2016/08/549.htmlhttps://github.com/flc1125/Ap... 部署說明 現(xiàn)有API基于laravel框架開發(fā),...
showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社區(qū)優(yōu)秀文章 Laravel 5.5+passport 放棄 dingo 開發(fā) API 實戰(zhàn),讓 API 開發(fā)更省心 - 自造車輪。 API 文檔神器 Swagger 介紹及在 PHP 項目中使用 - API 文檔撰寫方案 推薦 Laravel API 項目必須使用的 8 個...
摘要:像操作系統(tǒng)一樣,你可以通過安裝軟件,成為適用于你的電腦。先進(jìn)的技術(shù)方案,使得你無需擔(dān)心后期功能拓展與迭代問題,大大降低了維護(hù)成本。對于一個超過三年生命周期的項目來說,最適合不過??傊切碌募夹g(shù)方向標(biāo),能讓每個藝術(shù)家像構(gòu)建工程一樣構(gòu)建程序。 這是我們團(tuán)隊的一個非盈利項目,以Apache2.0協(xié)議開源...不限制商用 Notadd是什么 Notadd 是基于Laravel 和 Vue 的...
閱讀 2211·2019-08-30 15:54
閱讀 1948·2019-08-30 13:49
閱讀 666·2019-08-29 18:44
閱讀 824·2019-08-29 18:39
閱讀 1104·2019-08-29 15:40
閱讀 1525·2019-08-29 12:56
閱讀 3134·2019-08-26 11:39
閱讀 3094·2019-08-26 11:37