>

Hey,I'am Rander

laravel6 项目模块化管理和子域名配置-安装[nWidart/laravel-modules]

2020-05-20 php编程

安装模块化管理工具
扩展包: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 重新加载,到此扩展包安装全部完成。

创建模块
使用扩展包的命令创建 Blog 和 Shop 两个模块

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'));
    }
修改模块路由
扩展包为我们创建的每个模块都有独立的配置、迁移文件、控制器、路由文件等,但是默认的路由中使用的是路由前缀的方式,需要修改每个模块对应的路由文件,去除前缀。如在 Modules/Blog/Routes/web.php 中:

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

Route::get('/', 'BlogController@index');
同时,还要把模块自动加载的路由关掉,不然路由文件会被引入两次,可在控制台通过 php artisan route:list 命令查看。
Modules\Blog\Providers\RouteServiceProvider

public function map()
{
    // $this->mapApiRoutes();

    // $this->mapWebRoutes();
}
配置子域名
在 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
查看页面结果



结果符合预期。