至於為什麼要劃分模組以及是使用子域名還是使用字首等問題,鄙人是很想聲情並茂的舉例描述的,奈何表達能力弱,語言組織能力不行,就直接按部就班的記錄操作過程吧。 在此很感謝 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
重新載入,到此擴充套件包安裝全部完成。
建立模組
使用擴充套件包的命令建立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'));
}
注意:在
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 專案同時配置不同域名 api.domain(使用者端介面) 和 ad...)
(098. 模組化管理工具—— nwidart/Laravel-modules)