Laravel 项目模块化管理和子域名配置

至于为什么要划分模块以及是使用子域名还是使用前缀等问题,鄙人是很想声情并茂的举例描述的,奈何表达能力弱,语言组织能力不行,就直接按部就班的记录操作过程吧。 在此很感谢 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'));
    }

修改模块路由

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

查看页面结果

Laravel 项目模块化管理和子域名配置

Laravel 项目模块化管理和子域名配置

结果符合预期。

参考

(博客:单个 Laravel 项目同时配置不同域名 api.domain(用户端接口) 和 ad...)
(098. 模块化管理工具—— nwidart/Laravel-modules)
(博客:Laravel 模块化开发)

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1

谢谢分享,学习了。

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!