Laravel 项目模块化管理和子域名配置
至于为什么要划分模块以及是使用子域名还是使用前缀等问题,鄙人是很想声情并茂的举例描述的,奈何表达能力弱,语言组织能力不行,就直接按部就班的记录操作过程吧。 在此很感谢 Summer 的提议(博客:表达能力较弱的同学,可以先从写「技术日志」开始)。
安装模块化管理工具
安装
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
查看页面结果
结果符合预期。
参考
(博客:单个 Laravel 项目同时配置不同域名 api.domain(用户端接口) 和 ad...)
(098. 模块化管理工具—— nwidart/Laravel-modules)
(博客:Laravel 模块化开发)
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: