日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于 Module 的 Laravel API 架构

發布時間:2025/4/5 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于 Module 的 Laravel API 架构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自 PHP / Laravel 開發者社區 https://laravel-china.org/top...

我非常喜歡編寫基于模塊化設計的軟件和編程方式,但我不太喜歡依賴第三方軟件包和類庫來處理一些瑣碎的事情,因為它們不會讓你的編程水平得到很好的提升。所以這兩年來,我一直在用Laravel編寫基于模塊的軟件,現在我對這個結果非常滿意。

推動我走向基于模塊化設計的軟件和編程方式的決定性因素是我想持續提升我的編程水平。想象一下,你構建了一個項目結構,6個月后你發現這個項目存在很多bug。在不影響6個月現有代碼的情況下,通常不會輕易改變項目架構。在分析這個項目時,我注意到了兩個要點:你要么在整個項目中都有一個標準,要么堅持下去,要么模塊化并逐個模塊地改進。

有些人傾向于不惜一切代價、固守標準地開發,即使這可能意味著要堅持一個你不再喜歡的標準。就我個人來言,我更喜歡持續地改進,若是第 20 個模塊和第 1 個模塊寫得完全不一樣也沒關系。如果某天我需要回到模塊 1 修復 BUG 或重構,我可以將其改進為第 20 個模塊使用的最新標準。

假設,你也像我一樣喜歡基于模塊化開發 Laravel 應用、盡可能避免在項目中添加不必要的第三方依賴——本文是我的一點經驗。

1- 路由服務提供者

Laravel 路由系統可以說是整個應用的入口。首先需要修改的是默認的 RouteServiceProvider.php 文件,它應當將現有路由模塊化。

<?php namespace App\Providers; use Illuminate\Support\Facades\Route; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; class RouteServiceProvider extends ServiceProvider {/*** 定義應用路由。** @return void*/public function map(){$this->mapModulesRoutes();}protected function mapModulesRoutes(){// 如果你在編寫傳統 Web 應用而非 HTTP API,請使用 `web` 中間件。 Route::middleware('api')->group(base_path('routes/modules.php'));} }

如上,我們可以直接擺脫該文件的整個樣板,只需設置一個模塊化的路由文件即可。

2- 模塊文件

Laravel 在?routes?文件夾中自帶了一些文件。由于我們已經不在 RouteServiceProvider 中映射這些路由,所以可以直接刪除它們。接下來,我們創建一個 modules.php 路由文件。

<?php use Illuminate\Support\Facades\Route; Route::group([], base_path('app/Modules/Books/routes.php')); Route::group([], base_path('app/Modules/Authors/routes.php'));

3- Books 模塊

在?app?文件夾中,創建?Modules/Books/routes.php 文件。在此文件中,我們可以定義該應用 Books 模塊的路由規則。

<?php use App\Modules\Books\ListBooks; use Illuminate\Support\Facades\Route; Route::get('/books', ListBooks::class);

你可以使用基于控制器——也就是 Laravel 中默認標準的路由方式,但我個人更喜歡 Good bye controllers, hello Request Handlers(放棄控制器,采用請求處理器)?的方式。 如下是 ListBooks 的實現。

<?php namespace App\Modules\Books; use App\Eloquent\Book; use App\Modules\Books\Resources\BookResource; class ListBooks {public function __invoke(Book $book){return BookResource::collection($book->paginate());} }

以上代碼中 BookResource?是 Laravel 的資源轉換層。按照官方對于命名空間的建議,我們可以在 app/Modules/Books/Resources 文件夾中創建它。

<?php namespace App\Modules\Books\Resources; use Illuminate\Http\Resources\Json\Resource; class BookResource extends Resource {public function toArray($request){return ['id' => $this->resource->id,'title' => $this->resource->title,];} }

4- Authors 模塊

我們還可以通過 Routes 文件來啟動 Authors 模塊。

<?php use App\Modules\Authors\ListAuthors; use Illuminate\Support\Facades\Route; Route::get('/authors', ListAuthors::class);

注意: ?app/Modules/Authors 這個命名空間正表示我們所編寫的文件,對于請求處理程序來說也是非常簡單的。

<?php namespace App\Modules\Authors; use App\Eloquent\Author; use App\Modules\Authors\Resources\AuthorResource; class ListAuthors {public function __invoke(Author $author){return AuthorResource::collection($author->paginate());} }

最后,我們將編寫的 Resource 類轉變為響應式的 JSON 格式。

<?php namespace App\Modules\Authors\Resources; use App\Modules\Books\Resources\BookResource; use Illuminate\Http\Resources\Json\Resource; class AuthorResource extends Resource {public function toArray($request){return ['id' => $this->resource->id,'name' => $this->resource->name,'books' => $this->whenLoaded('books', function () {return BookResource::collection($this->resource->books);})];} }

注意資源是如何進入另一個模塊以重用 BookResource 。 這通常不是一個比較好的選擇,因為模塊應該是完全自給自足的,并且只能重用標準類,例如 Eloquent Models 或設計用于在任何模塊上通用的通用的組件。 這個問題的解決方案通常是將 BookResource 復制到 Authors 模塊中,從而可以在不使用另一個模塊的情況下進行更改,反之亦然。 我決定保留這個跨模塊的用法,這個例子表現出一個很好的經驗方法,就是讓模塊之間彼此隔離,但是如果你認為上面的例子很簡單并且不太可能帶來任何問題。 始終確保編寫測試以涵蓋您編寫的功能,以避免其他人在不知不覺中修改您的應用程序。

5- 結語

雖然這是一個非常簡單的例子,但我希望它能夠讓人們根據自己的需要來輕松操作使用 Laravel 框架的結構標準。您可以非常輕松地更改文件的位置,以便構建基于模塊化的應用程序。我的大多數項目都附帶了 App / Components 模塊,可以適用于任何模塊可重用的泛類型的基礎類;?App / Eloquent ,Modules 文件夾可以用于保存 Eloquent 模型和數據庫關系模型,我們可以在其中構建任何基于模塊化的功能。 這是我最近開始研究的應用程序的文件夾目錄結構:

我希望每個人都能從中得到這個概念,每個模塊都有自己的需求,并且可以擁有自己的文件夾/實體/類/方法/屬性。沒有必要將所有模塊標準化完全相同,因為某些模塊比其他模塊簡單得多,并且不需要大量的結構設計。此示例顯示AccountChurn模塊通過 HTTP 文件夾提供 API,同時仍通過控制臺提供 Artisan 命令。另一方面,AccountOverview則僅提供 HTTP API,并且依賴倉庫、值對象(bags)以及服務類(paginators)來提供更大的數據價值。

總結

以上是生活随笔為你收集整理的基于 Module 的 Laravel API 架构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美久久久久久又粗又大 | 色日韩| 国产三级理论 | 深夜精品视频 | a级黄色片| 成年人晚上看的视频 | 天天插日日插 | 天天色天 | 99一级片 | 国产微拍精品一区 | 视频在线免费 | 黄wwwww | 美女调教视频 | 在线a网站| 国产小视频在线 | 国产三区在线成人av | 亚洲区国产区 | 国产精品欧美久久久久天天影视 | 日韩精品一区二区三区免费视频 | 无码日韩精品一区二区 | 秋霞在线视频观看 | 亚洲色图 一区二区 | av高清不卡| 国产淫| 国产xxx| 日本在线播放一区 | 骑骑上司妻电影 | 99re热在线视频 | 香蕉视频亚洲一级 | 婷婷综合另类小说色区 | 色接久久 | 亚洲午夜福利一区二区三区 | 好男人www社区在线视频夜恋 | 黄色天堂av | 黄色一级片网站 | 青青草在线播放 | 99久久久无码国产精品性波多 | 婷婷在线看 | 人人妻人人澡人人爽久久av | 午夜狠狠干 | 男人与雌性宠物交啪啪 | 番号动态图 | 18p在线观看| 中国三级视频 | 亚洲123区| 法国性xxxx精品hd | 日韩成人av免费在线观看 | 九色视频91| 日韩香蕉视频 | 日本高清视频www夜色资源 | 你懂的91 | 日本加勒比在线 | 在线 色| 国产主播99 | 国产精品久久影视 | 免费看一级黄色片 | 91在线免费视频观看 | 麻豆视频传媒入口 | 久久av无码精品人妻出轨 | 尤物视频免费观看 | 日本一区高清 | 国产91沙发系列 | 日本在线视频中文字幕 | 北条麻妃av在线播放 | 色欲av永久无码精品无码蜜桃 | av手机观看 | 风间由美一区二区 | 亚洲视频色 | 妻子的性幻想 | 久草aⅴ | 天天射天天 | 屁股夹体温计调教play | 草免费视频 | 成年人三级视频 | 国内精品999 | 亚洲激情视频网 | 色久网| 亚洲黄色网址大全 | 成人免费性视频 | 久艹在线视频 | 特色特色大片在线 | 国产欧美一区二区三区白浆喷水 | 亚洲天堂网在线观看视频 | 少妇一级视频 | 麻豆三级在线观看 | av五月天在线 | 欧美黄色免费大片 | 国产91成人 | 亚洲一区二区精品在线观看 | 国模丫头1000人体 | 性感少妇av | 伊人啪啪 | 国产精品久久久国产盗摄 | 91精品又粗又猛又爽 | 日韩视频免费看 | 国产又爽又黄视频 | www插插插 | 麻豆一区二区三区在线观看 | 午夜视频在线播放 |