抽离前需确认代码可复用性:不强依赖项目配置、不硬编码表名或路由、业务逻辑与框架代码分离清晰;Composer配置须手动补全type、autoload、require、extra等关键字段;本地开发应使用path repository方式实现热更新。

抽离前先确认代码是否具备可复用性
直接把项目里某个控制器或模型硬塞进新包,大概率会失败。真正能抽成扩展包的代码,得满足几个硬条件:不强依赖项目特定配置、不硬编码数据库表名或路由前缀、业务逻辑和框架胶水代码分离清晰。比如你有个「订单导出 Excel」功能,如果里面混着 $request->user()->id 和 config('app.timezone') 还算可控;但要是写了 Auth::guard('admin')->user() + DB::table('admin_orders'),就得先抽象出用户上下文接口和数据源适配层。
composer.json 必须手动补全的关键字段
composer init 生成的默认配置几乎没用,尤其对 Laravel 包。以下字段必须手写,漏一个就可能让类加载失败或 provider 不被识别:
-
"type": "laravel-package"—— 不是强制项,但加上后 Laravel 10+ 的自动发现机制才认你 -
"autoload": {"psr-4": {"Acme\Export\": "src/"}}—— 命名空间必须和目录结构严格对应,src/下不能有Acme/Export/子目录 -
"require": {"php": "^8.1", "illuminate/support": "^10.0"}—— 如果用了 Laravel 辅助函数或 Contracts,就得显式声明框架依赖 -
"extra": {"laravel": {"providers": ["Acme\Export\ExportServiceProvider"]}}—— 自动发现不开时,靠这个硬注册
本地开发时怎么让主项目实时读取修改
别用 composer require acme/export 拉远程包,改一行代码就得 composer update 等半分钟。正确做法是主项目的 composer.json 加 path repository:
"repositories": [
{
"type": "path",
"url": "../acme-export"
}
]
然后运行 composer require acme/export:@dev(注意 @dev)。Composer 会创建 symlink 到本地目录,改 src/ 里的任何文件,Laravel 下次请求就生效。Windows 用户注意:确保启用了开发者模式,否则 symlink 可能失败。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
provider 类放哪、叫啥名、怎么写才不被忽略
Laravel 不会扫描 vendor 里的任意 PHP 文件。你的 ExportServiceProvider 必须满足三个条件才能被加载:
- 文件路径是
src/ExportServiceProvider.php(不是src/Providers/ExportServiceProvider.php) - 类名必须是
AcmeExportExportServiceProvider,且继承IlluminateSupportServiceProvider - 类里至少有一个方法:要么
register()绑服务,要么boot()做初始化,空类会被跳过
如果用了自动发现,还要检查 composer dump-autoload 是否执行成功——失败时不会报错,但 php artisan package:discover 会显示 “No packages found for pattern”。
最常被忽略的是 autoload 和 provider 路径的耦合关系:哪怕命名空间写对了,只要 src/ 目录下多了一层子目录,或者文件名大小写和类名不一致(比如 exportserviceprovider.php),Laravel 就完全看不到它。

















