相对完整 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.xxcom}]}一般项目都已经加入 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.phpconfig_path(zwdd.php)],config);}/** * 如果需要可以绑定单例 * * return void */publicfunctionregister(){$this-app-singleton(zwdd,function($app){returnnewZwdd();});}}如果需要Facede的话可以创建对应的文件这样全局可以采用类似静态引用的方式?phpnamespaceMaxlcoder\LaravelZwdd\Facades;useIlluminate\Support\Facades\Facade;classZwddextendsFacade{protectedstaticfunctiongetFacadeAccessor(){returnzwdd;}}当前扩展好的配置信息安排在packages/maxlcoder/laravel-zwdd/src/config目录没有就创建下。zwdd.php文件内容如?phpreturn[app_serverenv(ZWDD_APP_SERVER,),app_keyenv(ZWDD_APP_KEY,),app_secretenv(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(){returnaccessToken;}}本地引用修改主项目目录下的composer.json增加repositoriesrepositories:[{type:path,url:packages/maxlcoder/laravel-zwdd}]本地主项目引入本地扩展包composer require maxlcoder/laravel-zwdd:dev-main可以创建一个 console 命令测试一下均输出access_tokenpublicfunctionhandle(){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 gitgithub.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 包的开发过程结束。或许会有一些细节处的疑问基本上可以再在网上查找一下资料进行相关处理。