寫在前面的廢話:)
想弄一個sdk是因為,公司專案是微服務模式,就是一個專案有十幾個庫(可能更多… 然後每個庫的配置都差不多(日誌、文件、異常處理、正常處理、公共中介軟體、helpers檔案……我司還有資料庫時間格式統一為時間戳的要求,時間戳還要滿足軟刪除,這樣也要對Model做一定的修改),改了一處可能就需要十多個庫一個個改(很低效...但我們現在就是這麼做的。
前幾天忽然想到,我其實可以弄一個sdk,每個程式碼庫直接composer引入包就好了,改也只需要改sdk一處。
所以,這個sdk,其實是基於公司現有專案自己的思考和最佳化。還有自己寫的玩的小專案,也差不多是同樣的配置。
這個貼,是記錄 我學習嘗試寫sdk。
第一步肯定是composer.json
翻到vendor目錄下隨便找一個包的composer.json,複製一份,然後修修改改就好了。(以下程式碼如果要copy,要刪除掉裡面的註釋內容哦
{
"name": "aen233/iu-sdk",
"description": "iu-sdk for Laravel",
"keywords": ["laravel"],
"license": "MIT",
"authors": [
{
"name": "aen233",
"email": "284767378@qq.com"
}
],
"require": {
"php": ">=7",
"illuminate/support": "5.5.x|5.6.x|5.7.x|5.8.x"
},
"autoload": {
"psr-4": {
// 主要修改的就是這裡
"Aen233\\IUSDK\\": "src/"
},
// 註冊了一個helpers檔案,放自建的幫助函式
"files": [
"src/helpers.php"
]
},
// extra這段是配置laravel5.5+的擴充套件包自動發現的,
// 如果不加這段,你在config/app.php中的providers陣列裡新增一下也可以
"extra": {
"laravel": {
"providers": [
"Aen233\\IUSDK\\IUSDKServiceProvider"
]
}
},
"minimum-stability": "dev"
}
第二步應該是ServiceProvider
<?php
namespace Aen233\IUSDK;
use Aen233\IUSDK\Http\Middleware\Access;
use Aen233\IUSDK\Http\Middleware\After;
use Illuminate\Support\ServiceProvider;
use Illuminate\Contracts\Http\Kernel;
class IUSDKServiceProvider extends ServiceProvider
{
public function boot()
{
// 檢視目錄指定,在控制器中可以使用 雙冒號,就是 return view('iu-sdk::doc')這樣
$this->loadViewsFrom(__DIR__ . '/../resources/views/iu-sdk', 'iu-sdk');
// 註冊擴充套件包路由,使用php artisan route:list 命令可以檢視是否生效
$this->loadRoutesFrom(__DIR__ . '/../routes/routes.php');
// 自定義的方法,註冊中介軟體
$this->registerMiddle();
$this->publishes([
__DIR__ . '/../storage/doc' => base_path('storage/doc'), // 釋出doc demo 到 laravel的 storage 下
// 釋出檢視目錄到resources 下
// 如果有loadViewsFrom() , 就不需要publishes() 這些頁面了
// publish和load的區別,我理解的是如果這些檔案需要下載者自定義修改配置,就使用publish,如果大機率不會改動,load就好了
// __DIR__ . '/../resources/views/iu-sdk' => base_path('resources/views/iu-sdk'),
// 釋出配置檔案到 laravel 的config 下
// __DIR__ . '/../config/error_code.php' => config_path('error_code.php'),
]);
// 以上方法中,loadViewsFrom()、loadRoutesFrom()、publishes() 這幾個方法是繼承的laravel ServiceProvider中的方法,小夥伴們可以去翻原始碼
}
public function registerMiddle()
{
/** @var \Illuminate\Foundation\Http\Kernel $kernel */
$kernel = $this->app->make(Kernel::class);
// pushMiddleware()這個函式,是laravel原始碼中的方法,註釋是' Add a new middleware to end of the stack if it does not already exist.' 新增一個新的中介軟體到棧的最後。
// 以下兩行,分別是新增自定義的兩個中介軟體,Access是前置中介軟體,用來記錄請求日誌,After是後置中介軟體,用來格式化介面響應格式,以及記錄響應日誌。
$kernel->pushMiddleware(Access::class);
$kernel->pushMiddleware(After::class);
return $kernel;
}
}
第三步是加加加配置,中介軟體、頁面、等等等
第三步加的檔案,主要是將之前程式碼中公共的部分提出來
我之前記過筆記,
使用後置中介軟體自定義介面成功返回格式
自定義介面錯誤響應格式
用markdown寫介面文件
嗯每篇筆記中程式碼可能會有變動,一直也在最佳化啊。
這裡有做新嘗試的是,Doc和Log兩個之前寫在控制器裡的方法,我將其寫在Http Handler中了,見跟控制器說再見吧,從今天開始使用請求處理器(Request Handlers) 正規化這篇。 我個人蠻喜歡這種方式的,但是請求處理器和控制器,我覺得具體情況具體分析吧~畢竟預設是控制器,控制器也很好用^_^
第四步是提交到git以及packagist網站(https://packagist.org/)
其實第二步和第三步都可以先跳過,有了第一步的composer.json,在composer.json目錄下建一個src目錄,src目錄裡寫一個最簡單的類。然後直接第四步,等到composer require
能正常引入後再新增ServiceProvider和相關程式碼。建立git倉庫,獲取該sdk的git地址,然後packagist網站中登入(可以直接用github賬號登入的),然後右上角點選submit
,然後填入該sdk的git地址。
然後就有該sdk的packagist地址了(我的在這裡~,點進去點選update
,就自動釋出了,不需要在git倉庫中release那一步。可以配置git和packagist的關聯,這樣update
這一步就可以省略了。
第五步是composer.json中引入該sdk
因為還在dev階段,直接composer require aen233/iu-sdk
會報錯,所以是在composer.json的require中新增"aen233/iu-sdk": "dev-master"
,然後執行composer update
orcomposer update aen233/iu-sdk
接下來,執行php artisan vendor:publish --provider="Aen233\IUSDK\IUSDKServiceProvider"
,會把doc demo複製到storage目錄下,直接訪問{{domain}}/doc
, 就可以看到文件了。
哦,如果要用這個iu-sdk的異常處理,需要在專案中的 bootstrap/app.php
中修改一行。
$app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class,
Aen233\IUSDK\Exceptions\Handler::class // 原來是App\Exceptions\Handler::class
);
走幾個介面,日誌、返回格式、報錯都正常,這個sdk就ok了。
其他就沒什麼了,時間戳軟刪除的那個,專案中每個庫都修改過了,主要是我個人主觀意識上更喜歡laravel原本的時間格式,所以沒有加進來。如果會用到專案中,肯定也會做相應調整。
本作品採用《CC 協議》,轉載必須註明作者和本文連結