小白折腾服务器(九):一步一步搭个自己的 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 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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
php @ abc
文章
20
粉丝
94
喜欢
198
收藏
232
排名:106
访问:8.9 万
私信
所有博文
社区赞助商