相对完整 laravel 扩展包开发过程
说明
最近要在 laravel 项目中集成专有钉钉,官方的 php sdk 就一个脚本文件,不利于引用,想着造一个轮子。于是结合网上的教程,顺带整理一下个人在实践过程中认为比较完整的 laravel 自定义扩展包的开发经过。
前提
我们在开发扩展包的时候要确定好包的适用范围,如果你希望开发的包是可以在使用 composer 的项目都可以用,没有特定的框架限制,那么包需要指定依赖 PHP,同时包中要避免使用框架的内置功能。由于我这边包指定在 laravel 框架下使用,因此需要指定依赖 laravel ,同时包中可以使用 laravel 框架的一些特性,同时可以针对 laravel 框架做简化。
包开发步骤
初始化扩展包
- 找一个 laravel 项目或者新建一个
- 在项目内新建
[目录]/[用户名]/[包名]目录,形如packages/maxlcoder/laravel-zwdd - 进入
packages/maxlcoder/laravel-zwdd目录,执行composer init初始化,该怎么填就怎么填,其间会提示有没有依赖的包,由于这边依赖 laravel 所以按照提示操作即可,完成之后得到如下composer.json
注意
在require中如果是需要使用 laravel 项目内容避免直接依赖 laravel 整个框架,只需要依赖核心包illuminate/support即可
{"name":"maxlcoder/laravel-zwdd","type":"library","require":{"php":"^7.3|^8.0","illuminate/support":"^9.0|^10.0|^11.0","alibabacloud/oss-v2":"^0.4.0"},"autoload":{"psr-4":{"Maxlcoder\\LaravelZwdd\\":"src/"}},"authors":[{"name":"xxx","email":"xxx.xx@com"}]}- 一般项目都已经加入 git 管控,所以我们需要把
packages在主项目的 git 中忽略,修改.gitignore增加
/packages- 扩展包可以单独进行 git 版本管理
包开发
- 在
packages/maxlcoder/laravel-zwdd/src目录下新建 ServiceProvider, 如ZwddServiceProvider.php文件,下面仅展示了,配置发布的,如果大家有其他的配置发布需求,覆盖已发布配置,或者发布其他文件,可以参考官方的扩展包开发说明进行配置。可以注册绑定单例,这样在使用的时候可以通过app('zwdd')全局引用。
<?phpnamespaceMaxlcoder\LaravelZwdd;useIlluminate\Support\ServiceProvider;classZwddServiceProviderextendsServiceProvider{publicfunctionboot(){// 发布配置$this->publishes([__DIR__.'/config/zwdd.php'=>config_path('zwdd.php')],'config');}/** * 如果需要可以绑定单例 * * @return void */publicfunctionregister(){$this->app->singleton('zwdd',function($app){returnnewZwdd();});}}- 如果需要
Facede的话,可以创建对应的文件,这样全局可以采用类似静态引用的方式
<?phpnamespaceMaxlcoder\LaravelZwdd\Facades;useIlluminate\Support\Facades\Facade;classZwddextendsFacade{protectedstaticfunctiongetFacadeAccessor(){return'zwdd';}}- 当前扩展好的配置信息安排在
packages/maxlcoder/laravel-zwdd/src/config目录(没有就创建)下。zwdd.php文件内容如
<?phpreturn['app_server'=>env('ZWDD_APP_SERVER',''),'app_key'=>env('ZWDD_APP_KEY',''),'app_secret'=>env('ZWDD_APP_SECRET',''),];- 新建服务类,如
packages/maxlcoder/laravel-zwdd/src/Zwdd.php
<?phpnamespaceMaxlcoder\LaravelZwdd;useIlluminate\Support\Facades\Cache;classZwdd{protected$client;publicfunction__construct(){// $this->client = '';}/** * 获取 access_token */publicfunctionaccessToken(){return'accessToken';}}本地引用
- 修改主项目目录下的
composer.json,增加repositories
"repositories":[{"type":"path","url":"packages/maxlcoder/laravel-zwdd"}]- 本地主项目引入本地扩展包
composer require maxlcoder/laravel-zwdd:dev-main- 可以创建一个 console 命令,测试一下,均输出
access_token
publicfunctionhandle(){dump(ZwddFacade::accessToken());dump(app('zwdd')->accessToken());dump((newZwdd)->accessToken();}发布
- 发布之前可以在扩展包中配置包的自动发现,这样别人使用 composer require 添加包依赖之后,就可以不用在
app.php中进行配置引入ServiceProvider和Facade,修改packages/maxlcoder/laravel-zwdd/composer.json文件,添加如下内容
"extra":{"laravel":{"providers":["Maxlcoder\\LaravelZwdd\\ZwddServiceProvider"]}}- 在 github 创建包对应的 repository ,在
packages/maxlcoder/laravel-zwdd目录下新增.gitignore文件,内容如下,忽略到本地测试文件
/vendor- 再在
packages/maxlcoder/laravel-zwdd目录下执行如下命令,将包推送到 github 上
git init git add.git commit-m"初始化"git branch-M main git remote add origin git@github.com: xxx/xxx.git git push-u origin main- 在 packagist.org 网站发布包
- 修改主项目下的
composer.json移除前面加的repositories,使用如下命令引入发布的包
composer require maxlcoder/laravel-zwdd- 当下次再对扩展包进行调整时,再添加回
repositories,同时执行composer remove maxlcoder/laravel-zwdd先移除发布的包,再执行composer require maxlcoder/laravel-zwdd:dev-main引入本地的扩展包进行开发调试
结束
至此,整个 laravel 包的开发过程结束。或许会有一些细节处的疑问,基本上可以再在网上查找一下资料,进行相关处理。
