小白折騰伺服器(九):一步一步搭個自己的 Composer 包

aen233發表於2019-04-04

寫在前面的廢話:)
想弄一個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 updateorcomposer 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 協議》,轉載必須註明作者和本文連結

相關文章