小白折腾服务器(九):一步一步搭个自己的 Composer 包
写在前面的废话:)
想弄一个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 协议》,转载必须注明作者和本文链接