主要參考:基於 Module 的 Laravel API 架構
前言
又是一篇討論目錄結構的口水文章(筆記額。。。
專案中有多個模組是很常有的事,可能大多數小夥伴會在laravel原本的app下的Controllers
、Models
、 Observers
、 Jobs
、.....目錄下分別新建多個模組目錄。可是這樣當專案變得龐大,將會很難維護。如果使用模組化設計,相當於多個模組公用一套laravel底層程式碼,會清晰許多,有的模組簡單(結構也簡單),有的模組複雜(結構也複雜),迭代也容易許多(你可以老模組用舊標準、新模組用新標準),升級也會容易許多(如果你需要從低版本升到高版本,又只需要其中一部分模組,你可以把舊版本你需要的幾個模組的程式碼提出來放到新版本中)。
上圖,模組化的 目錄結構
以及 名稱空間namespace
、類引用use
大概是這樣
app目錄保留,只放一些必須公用的東西,比如異常處理、中介軟體、Providers,越簡單越好。
當然不同模組,你想自定義單獨模組異常處理和中介軟體都很方便。
以下是我的筆記:
step 0. 肯定是先建立module目錄,新建兩個模組以及各自模組的路由檔案。
step 1. 修改 app/RouteServiceProvider.php
中的 mapApiRoutes()
方法,給它新增一個指向 routes/modules.php
的路由組。
protected function mapApiRoutes()
{
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
//以下為新增
Route::middleware('api')
->group(base_path('routes/modules.php'));
}
step 2. 修改 composer.json
, 具體是autoload
的psr-4
欄位 ,給它新增你需要的專案模組psr-4的自動載入,(找"App\\": "app/"
,加在它下面~
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\\": "app/",
"Blog\\": "modules/Blog", //新增
"Shop\\": "modules/shop" //新增
},
"files": [
"bootstrap/helpers.php"
]
},
這裡,其實是可以建立和app平級的目錄,可是,假如你有20+模組,這就很可怕了,還是放在modules裡好一點.
別忘了執行
composer dump-autoload
setp 3. 新增routes/modules.php
, 新增指向所需模組(這裡是Blog和Shop)的路由組。
<?php
Route::prefix('blog')
->namespace('Blog\Http\Controllers')
->group(base_path('modules/Blog/routes.php'));
Route::prefix('shop')
->namespace('Shop\Http\Controllers')
->group(base_path('modules/Shop/routes.php'));
step 4. 修改模組下Controller、Model等目錄的名稱空間和引用。(如果是新模組,直接新建咯namespace App\Http\Controllers\Blog;
→ namespace Blog\Http\Controllers;
use App\Models\Blog\Topic;
→ use Blog\Models\Topic;
step 5. 測試.postman跑介面,都是ok噠。
後記
還沒解決的問題:migrations檔案怎樣更改目錄? 好像是隻能放到database/migrations下面。
其他todo:新增Module相關的artisan命令。
本作品採用《CC 協議》,轉載必須註明作者和本文連結