iBrand 系統在搭建的時候,最注重的就是可複用性,希望通過產品+項目的方式積累下來的代碼能夠重複使用在不同類型的項目上,所以我們把公用的功能都獨立成 package
本教程就是基於目前商用的 iBrand 新零售系統抽離出來的,通過一個截圖我們來看目前商用系統的架構設計。
每一個 Component 都是獨立 package
,我們通過 Composer
把它們組裝起來。目前我們通過 Satis
服務把這些 package
部署在我們私有服務器上。
使用 Satis 搭建私有的 Composer 包倉庫
本次教程我們也將繼續這種模式來進行敏捷迭代開發。
安裝 wikimedia/composer-merge-plugin
我們需要依賴 wikimedia/composer-merge-plugin
工具包,通過composer
安裝
composer require wikimedia/composer-merge-plugin
添加模塊
在開發階段所有的模塊都放在 modules
文件夾下,因此需要在項目根目錄新建 modules
文件夾。
接下來以添加一個 server
模塊爲例來演示模塊的添加,並且在下章 安裝 dingo API
會使用。
按照下面結構建立好相關文件和文件夾
api-tutorial-source
├── app
├── ...
└── modules
└── server
├── LICENSE
├── README.md
├── composer.json
├── src
│ └── Providers
│ └── ServerServiceProvider.php
└── tests
composer.json
Composer 基本用法
{
"name": "ibrand/server",
"type": "library",
"description": "ibrand api server",
"keywords": [
"iBrand",
"api",
"server"
],
"license": "MIT",
"authors": [
{
"name": "shjchen",
"email": "[email protected]"
}
],
"require": {
"php": ">=7.0"
},
"autoload": {
"psr-4": {
"iBrand\\Server\\": "src/"
}
},
"extra": {
"laravel": {
"providers": [
"iBrand\\Server\\Providers\\ServerServiceProvider"
]
}
},
"minimum-stability": "dev",
"prefer-stable": true
}
ServerServiceProvider
每個module
至少包含一個 ServiceProvider
,可以通過 Artisan
命令來新建
php artisan make:provider ServerServiceProvider
命令執行完畢後文件會默認創建在 app/Providers
下,我們剪貼到 modules/server/src/Providers
文件夾下。
識別模塊
合併 composer.json
打開項目的 composer.json
文件:
api-tutorial-source
├── app
├── ...
└── composer.json
找到 extra
添加 merge-plugin
內容如下:
"extra": {
"laravel": {
"dont-discover": [
]
},
"merge-plugin": {
"include": [
"modules/*/composer.json"
],
"require": [
],
"recurse": true,
"replace": false,
"ignore-duplicates": false,
"merge-dev": true,
"merge-extra": false,
"merge-extra-deep": false,
"merge-scripts": false
}
},
通過 include
指令把 server
module 下的 composer.json
合並進來。這樣項目就能夠自動識別 server
包下的命名空間。
"include": [
"modules/*/composer.json"
],
執行 composer update --lock
註冊ServiceProvider
打開 config/app.php
文件 providers
數組添加
/*
* Package Service Providers...
*/
iBrand\Server\Providers\ServerServiceProvider::class,
驗證
打開routes/web.php
, 通過 dd(app())
來看下 ServerServiceProvider
是否註冊成功
Route::get('/', function () {
dd(app());
return view('welcome');
});
chrome 打開 http://api.ibrand.test/
, 在 loadedProviders
數組中我們發現了 iBrand\Server\Providers\ServerServiceProvider
的蹤影。
小結
在後續的教程中,我們將不斷使用這種方式把各個 modules 添加到我們的項目中來,通過 composer 再加上程序設計(繼承、多態) 將盡量提高代碼的複用性,遠離複製粘貼 : )
本章小知識點:
- 瞭解 iBrand 項目基礎架構
- 學習 composer.json 的基本使用
- 瞭解 module/package 基礎開發方式