webman默认不开启自动依赖注入,必须在config/container.php中配置启用autowiring和attributes的php-di容器实例,否则手动new的对象均不触发依赖解析;接口绑定需显式配置且确保加载,构造函数注入仅对框架创建的对象生效。

Webman 默认不开启自动依赖注入,必须显式配置 PSR-11 兼容容器(如 php-di)并启用 autowiring,否则 new 出来的对象、手动实例化的控制器或服务,一律不会触发依赖解析。
webman 如何启用 php-di 自动注入
关键不是装包,而是让框架真正用上容器实例。只执行 composer require php-di/php-di:^7.0 不够,必须确保 config/container.php 返回的是一个启用了自动装配的 DI\Container 实例:
-
$builder->useAutowiring(true)必须开启,否则即使类有类型提示也不会自动解析依赖 -
$builder->useAttributes(true)才能支持#[Inject]等属性注入(PHP 8+) - 返回值必须是
$builder->build()得到的容器,不能是空数组、new Container()或其他自定义类 - 若项目已有
config/dependence.php,需确认其内容被$builder->addDefinitions()正确加载,否则接口绑定(如LoggerInterface::class => FileLogger::class)不会生效
构造函数注入失效的常见原因
看到 Uncaught DI\NotFoundException: No entry or class found for 'app\service\Mailer' 这类错误,基本不是代码写错了,而是容器没管到这个对象:
- 控制器是
new UserController($mailer)手动创建的 → 容器完全不参与,注入失效 - 服务类在
__invoke、中间件或定时任务里用new UserService()实例化 → 同样绕过容器 - 类名命名空间与文件路径不一致(如
app/service/Mailer.php里声明的是App\Service\Mailer),反射无法匹配类名 - 构造函数参数用了非类名的类型提示(如
string $host、array $config),php-di 默认不自动解析标量,需在 definitions 中显式配置
手动获取服务时该用 Container::get() 还是 Container::make()
二者行为差异直接影响单例性与参数传递能力:
-
Container::get(UserService::class):走容器单例注册逻辑,多次调用返回同一实例;但不接受运行时参数 -
Container::make(LogService::class, [$path, $name]):每次调用都新建实例,且支持传入构造参数;适合带动态参数的服务 - 注意:
Container::get()要求类已通过bind()或自动扫描注册;而make()在 autowiring 开启时可直接解析无绑定的类(前提是构造函数参数都能被容器提供) - 别在业务方法里滥用
support\Container::get()—— 这等价于隐藏依赖,IDE 无法推导类型,单元测试难 mock
接口绑定后仍报找不到实现类
典型现象:定义了 interface CacheInterface 和 class RedisCache implements CacheInterface,也在 config/dependence.php 里写了 CacheInterface::class => RedisCache::class,但注入时还是失败:
- 检查
config/container.php是否真把config/dependence.php加载进去了($builder->addDefinitions(config('dependence', []))) - 确认
RedisCache类本身没有未满足的构造依赖(比如它自己又依赖Redis实例,而Redis没绑定或不可自动解析) - php-di 的 autowiring 默认不扫描接口,只扫描具体类;所以必须显式
bind()接口到实现,不能指望它“猜” - 如果用了
useAttributes(true),但类里没加#[Inject],构造函数注入仍走默认逻辑,和注解无关
最易被忽略的一点:Webman 的依赖注入只作用于由框架生命周期创建的对象(如路由匹配到的控制器、中间件、事件监听器),所有你主动 new 的地方,都是容器的盲区 —— 这不是 bug,是设计使然。解耦的前提,是先放弃对 new 的条件反射。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











