Laravel 專案模組化管理和子域名配置

lianglunzhong發表於2019-08-07

至於為什麼要劃分模組以及是使用子域名還是使用字首等問題,鄙人是很想聲情並茂的舉例描述的,奈何表達能力弱,語言組織能力不行,就直接按部就班的記錄操作過程吧。 在此很感謝 Summer 的提議(部落格:表達能力較弱的同學,可以先從寫「技術日誌」開始)。

安裝模組化管理工具

擴充套件包:nWidart/laravel-modules

安裝

composer require nwidart/laravel-modules

釋出配置檔案

php artisan vendor:publish --provider="Nwidart\Modules\LaravelModulesServiceProvider"

修改 composer.json

{
  "autoload": {
    "psr-4": {
      "App\\": "app/",
      "Modules\\": "Modules/"
    }
  }
}

然後執行 composer dump重新載入,到此擴充套件包安裝全部完成。

建立模組

使用擴充套件包的命令建立BlogShop 兩個模組

php artisan module:make Blog Shop

配置子域名路由檔案

app/Providers/RouteServiceProvider 中新增每個模組子路由對應的路由方法。

public function map()
{
      $this->mapBlogRoutes();
      $this->mapShopRoutes();

      $this->mapApiRoutes();

      $this->mapWebRoutes();
  }

    protected function mapShopRoutes()
    {
        Route::domain(config('app.shop_domain'))
             ->middleware('web')
             ->namespace('Modules\Shop\Http\Controllers')
             ->group(base_path('Modules/Shop/Routes/web.php'));
    }

    protected function mapBlogRoutes()
    {
        Route::domain(config('app.blog_domain'))
             ->middleware('web')
             ->namespace('Modules\Blog\Http\Controllers')
             ->group(base_path('Modules/Blog/Routes/web.php'));
    }

注意:在 map() 方法中,新新增的 $this->mapBlogRoutes()$this->mapShopRoutes() 必須放在 $this->mapWebRoutes() 的前面才有效。

修改模組路由

擴充套件包為我們建立的每個模組都有獨立的配置、遷移檔案、控制器、路由檔案等,但是預設的路由中使用的是路由字首的方式,需要修改每個模組對應的路由檔案,去除字首。如在 Modules/Blog/Routes/web.php 中:

// Route::prefix('blog')->group(function() {
//     Route::get('/', 'BlogController@index');
// });

Route::get('/', 'BlogController@index');

配置子域名

config/app.php.env 中分別做如下配置:

'blog_domain' => env('BLOG_DOMAIN', 'blog.package.test'),
'shop_domain' => env('SHOP_DOMAIN', 'shop.package.test'),
BLOG_DOMAIN=blog.package.test
SHOP_DOMAIN=shop.package.test

配置 Homestead.yaml 和 系統hosts

Homestead.yaml 和系統的 hosts 檔案中分別新增子域名配置,對應的入口檔案和指向地址與主域名 package.test 配置完全相同即可。

重啟虛擬機器

vagrant  reload --provision

檢視頁面結果

Laravel 專案模組化管理和子域名配置

Laravel 專案模組化管理和子域名配置

結果符合預期。

參考

(部落格:單個 Laravel 專案同時配置不同域名 api.domain(使用者端介面) 和 ad...)
(098. 模組化管理工具—— nwidart/Laravel-modules)

相關文章