resolving回调监听容器“正要生成”实例的临界点,此时对象已创建但构造函数可能未执行完,支持动态注入依赖或增强对象;它不触发于resolve()或手动new,且需在register中注册。

在 Laravel 6 中,`resolving` 回调用于监听容器**即将解析出某个类的实例时**的那一刻,它不是监听“已生成”,而是监听“正要生成”的临界点——此时对象尚未完全构造完成,但依赖已开始注入、构造函数即将执行。
resolving 回调的基本用法
调用 app()->resolving() 并传入类名或闭包,即可注册监听:
- 监听特定类:
app()->resolving(Logger::class, function ($logger, $app) { ... }); - 监听所有类(慎用):
app()->resolving(function ($object, $app) { ... });
回调接收两个参数:$object 是即将被构建的实例(此时已 new 出来,但构造函数可能还未执行完),$app 是容器本身。注意:这个 $object 是引用传递,你可以在回调里对它做属性赋值、方法调用等增强操作。
它和 resolved 的关键区别
resolving 发生在实例创建后、构造函数执行中或刚结束时;而 resolved 是在实例完全构造完毕、已返回给调用方之后才触发。
- 如果你需要在对象初始化中途“打补丁”(比如动态设置一个未通过构造函数传入的依赖),用
resolving - 如果只是想记录日志或做副作用(如统计实例数),两者都可,但
resolved更安全,因为对象已稳定
常见使用场景
实际开发中,resolving 常用于以下情况:
-
自动注入非类型提示的依赖:比如某类构造函数是
__construct($config),容器无法推断$config,你可在 resolving 回调里手动赋值:$object->config = config('api'); -
为第三方类补充 Laravel 特性:例如给一个不继承任何基类的 SDK 客户端注入
app('request')或app('cache') -
调试依赖链:配合
var_dump(get_class($object))快速确认哪些类被容器真正尝试构建过
注意事项
这个回调只对通过 make() 或自动注入触发的解析生效,手动 new 的对象不会触发;它也不会被 resolve() 调用触发(resolve() 跳过所有生命周期回调);另外,在服务提供者的 register() 方法中注册最稳妥,避免因注册时机太晚而漏掉早期解析。











