当前位置: 首页 > news >正文

相对完整 laravel 扩展包开发过程

说明

最近要在 laravel 项目中集成专有钉钉,官方的 php sdk 就一个脚本文件,不利于引用,想着造一个轮子。于是结合网上的教程,顺带整理一下个人在实践过程中认为比较完整的 laravel 自定义扩展包的开发经过。

前提

我们在开发扩展包的时候要确定好包的适用范围,如果你希望开发的包是可以在使用 composer 的项目都可以用,没有特定的框架限制,那么包需要指定依赖 PHP,同时包中要避免使用框架的内置功能。由于我这边包指定在 laravel 框架下使用,因此需要指定依赖 laravel ,同时包中可以使用 laravel 框架的一些特性,同时可以针对 laravel 框架做简化。

包开发步骤

初始化扩展包

  1. 找一个 laravel 项目或者新建一个
  2. 在项目内新建[目录]/[用户名]/[包名]目录,形如packages/maxlcoder/laravel-zwdd
  3. 进入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"}]}
  1. 一般项目都已经加入 git 管控,所以我们需要把packages在主项目的 git 中忽略,修改.gitignore增加
/packages
  1. 扩展包可以单独进行 git 版本管理

包开发

  1. 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();});}}
  1. 如果需要Facede的话,可以创建对应的文件,这样全局可以采用类似静态引用的方式
<?phpnamespaceMaxlcoder\LaravelZwdd\Facades;useIlluminate\Support\Facades\Facade;classZwddextendsFacade{protectedstaticfunctiongetFacadeAccessor(){return'zwdd';}}
  1. 当前扩展好的配置信息安排在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',''),];
  1. 新建服务类,如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';}}

本地引用

  1. 修改主项目目录下的composer.json,增加repositories
"repositories":[{"type":"path","url":"packages/maxlcoder/laravel-zwdd"}]
  1. 本地主项目引入本地扩展包
composer require maxlcoder/laravel-zwdd:dev-main
  1. 可以创建一个 console 命令,测试一下,均输出access_token
publicfunctionhandle(){dump(ZwddFacade::accessToken());dump(app('zwdd')->accessToken());dump((newZwdd)->accessToken();}

发布

  1. 发布之前可以在扩展包中配置包的自动发现,这样别人使用 composer require 添加包依赖之后,就可以不用在app.php中进行配置引入ServiceProviderFacade,修改packages/maxlcoder/laravel-zwdd/composer.json文件,添加如下内容
"extra":{"laravel":{"providers":["Maxlcoder\\LaravelZwdd\\ZwddServiceProvider"]}}
  1. 在 github 创建包对应的 repository ,在packages/maxlcoder/laravel-zwdd目录下新增.gitignore文件,内容如下,忽略到本地测试文件
/vendor
  1. 再在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
  1. 在 packagist.org 网站发布包
  2. 修改主项目下的composer.json移除前面加的repositories,使用如下命令引入发布的包
composer require maxlcoder/laravel-zwdd
  1. 当下次再对扩展包进行调整时,再添加回repositories,同时执行composer remove maxlcoder/laravel-zwdd先移除发布的包,再执行
    composer require maxlcoder/laravel-zwdd:dev-main引入本地的扩展包进行开发调试

结束

至此,整个 laravel 包的开发过程结束。或许会有一些细节处的疑问,基本上可以再在网上查找一下资料,进行相关处理。

http://www.cnnetsun.cn/news/2143193.html

相关文章:

  • C++三大默认成员函数详解
  • TMD Matlab Toolbox v2.5:潮汐模型驱动的技术深度解析与架构剖析
  • Awesome Free Software的许可证解析:MIT、GPL、Apache的完整对比
  • c->c++(二):class
  • 看AI如何“火眼金睛”:实时口罩检测-通用模型案例效果图集
  • ROS2机器人实战:如何为你的奥比中光AstraPro相机选择合适的3D建图方案(rtabmap vs. 其他)
  • 终极指南:简单三步永久免费使用Cursor Pro的完整解决方案
  • 互联网大厂 Java 求职面试:音视频应用的技术挑战
  • 渗透测试新手必看:如何用V2.0工具快速上手20款主流OA系统的漏洞检测(附实战避坑指南)
  • DDrawCompat完整指南:在Windows 11上轻松修复经典老游戏兼容性问题
  • 凌晨2点,我的Agent把代码改崩了:从单点失控到专业团队协作的工程化思维
  • 从TAGE到TAGE-SC-L:一篇看懂现代CPU分支预测器的演进史
  • Ledger 官方授权经销商名单(含秘语盾认证渠道)
  • pfetch自定义开发:添加新的系统信息检测模块完整指南
  • Omron Subnet安全连接与证书验证:防止恶意攻击的完整方案
  • FPGA网络协议栈设计避坑指南:从ARP表管理到UDP校验和计算
  • 免费风扇控制终极指南:用Fan Control实现完美散热与静音平衡
  • Nest CLI 开发服务器工作原理:实时重载和热模块替换的实现机制
  • Bootstrap-Form-Builder拖放交互实现原理:事件处理与DOM操作
  • 日日升华(深圳)影视传媒有限公司与八佰里影业达成战略合作
  • 企业级字体革命:IBM Plex 零成本部署的完整实施路线图
  • 保姆级教程:用Windows/Mac电脑搞定乐高WeDo软件下载、汉化与蓝牙连接
  • 保姆级教程:手把手教你给vCenter 7.0配置SNMP代理,把告警精准推送到Zabbix
  • KubeDOOM架构剖析:Socket通信、VNC显示和Kubectl命令的完美融合
  • 深度解析microeco:如何构建高可信度微生物共现网络
  • 边缘AI轻量级神经网络STResNet架构解析与应用实践
  • SAM 3应用实战:电商商品图自动抠图,提升工作效率的利器
  • 高效文档格式转换方案:基于Spire.PDF的OFD到PDF转换技术实现
  • Python的__getattribute__方法实现属性访问追踪与调试在复杂系统的辅助
  • SWOT项目性能优化:10个技巧提升域名验证速度300%