模組化嘗試——基於 Module 的 Laravel API 結構

aen233發表於2019-02-27

主要參考:基於 Module 的 Laravel API 架構

前言

又是一篇討論目錄結構的口水文章(筆記額。。。

專案中有多個模組是很常有的事,可能大多數小夥伴會在laravel原本的app下的ControllersModelsObserversJobs、.....目錄下分別新建多個模組目錄。可是這樣當專案變得龐大,將會很難維護。如果使用模組化設計,相當於多個模組公用一套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 , 具體是autoloadpsr-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命令。

相關文章