直接用composer init生成骨架最省事,但需确保命名空间与src/目录严格对齐、type字段设为框架对应类型(如thinkphp-extension)、autoload用psr-4且路径不带斜杠尾缀,php版本约束写为"php": ">=8.0.0"。

怎么初始化一个可独立发布的业务扩展包
直接用 composer init 生成骨架最省事,但关键在三点:命名空间必须与 src/ 目录严格对齐、type 字段不能写成 library(若面向 ThinkPHP/Yii 等框架,应设为 thinkphp-extension 或 yii2-extension)、autoload 必须用 PSR-4 且路径不带斜杠尾缀。
常见错误是把 "YourNamespace\": "src/" 写成 "YourNamespace\": "src" 或 "src/" ——前者导致 Composer 2.x 在 strict 模式下拒绝 autoload,后者在 Windows 下可能触发路径解析异常。
- PHP 版本约束写成
"php": ">=8.0.0",别用^8.0(那是给包用的,不是给 PHP 解释器) - 如果包要被框架自动发现,需在
extra里声明引导类,如 ThinkPHP 要加"think-config": "config/app.php" - 别急着
git init,先composer dump-autoload --strict-psr过一遍,能过才说明结构干净
如何让业务逻辑不耦合框架又支持即插即用
核心是分层:底层纯函数/类只依赖接口(如 PsrLogLoggerInterface),不引入任何框架类;上层通过服务提供者(Service Provider)或引导类(Bootstrap)桥接框架容器。
比如一个订单校验逻辑,src/Validator/OrderRule.php 只接收数组参数并返回 bool 或 array 错误;而 src/ThinkPHP/OrderValidatorService.php 才负责从 $this->app->make('logger') 拿日志实例。这样单元测试时直接 new OrderRule 就行,不用启动整个框架。
- 避免在
src/下直接写app()->或hinkacadeDb::这类硬编码调用 - 配置文件(如
config/order.php)不要放具体值,只放开关和占位符,例如'enable_async_check' => false - 如果要用事件机制(如订单创建后触发通知),定义自己的事件类,而不是直接抛
thinkEvent的子类
为什么 composer install 后扩展没生效
大概率是服务提供者没注册,或自动加载路径没进主项目 vendor/composer/autoload_psr4.php。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
检查三处:composer.json 中 autoload 的命名空间是否与实际 PHP 文件头 namespace 完全一致(包括大小写);主项目 composer.json 是否把你的包加进了 require(不是 require-dev);如果是 ThinkPHP,确认 config/app.php 的 'providers' 数组里有你的服务提供者类名。
- 运行
composer show your-name/your-package看是否识别为已安装包 - 执行
composer dump-autoload -o强制刷新自动加载映射(开发中可省略-o,但 CI 流程必须加) - 用
composer why-not your-name/your-package:dev-main查依赖冲突,常见于topthink/framework版本锁死
怎么在不发版的前提下快速验证修改
本地开发时,别反复 composer update,用 path 仓库方式直连源码目录更高效。
在主项目的 composer.json 加一段:
"repositories": [
{
"type": "path",
"url": "../my-thinkphp-extension"
}
],
"require": {
"your-name/your-package": "*"
}
这样改完扩展包代码,主项目里 composer update your-name/your-package 就能立刻生效,无需 git tag 或 push 到远程。
- 注意
url是相对于主项目根目录的路径,Windows 下也用正斜杠 -
"*"会匹配dev-main分支,如果分支名是develop,就得写"dev-develop" - 上线前务必删掉
repositories块,否则 CI 会因找不到本地路径失败










