hyperf 的依赖注入(di)默认开启,无需额外配置;它基于 hyperf/di 组件随框架自动加载,是架构底层支撑机制,只要使用标准项目结构即全程可用。

Hyperf 的依赖注入(DI)默认开启,无需额外配置或「开启」操作。它从框架启动那一刻起就已内建运行,是整个 Hyperf 架构的底层支撑机制。
为什么不需要手动开启?
Hyperf 的 DI 容器基于 hyperf/di 组件,随框架自动加载。只要你用的是标准 Hyperf 项目结构(通过 composer create-project hyperf/hyperf-skeleton 创建),DiFactory 就已在 config/autoload/dependencies.php 中注册,容器在 Hyperf\Contract\ContainerInterface 下全程可用。
- 没有开关配置项(比如
enable_di => true这类设置) - 不依赖额外扩展或
php.ini修改 - 即使你删掉
config/autoload/dependencies.php,容器仍存在——只是少了自定义绑定规则
哪些情况会让依赖注入「看似失效」?
常见误解是“没开启”,实际多为使用方式或环境问题:
- 直接
new UserService():绕过了容器,#[Inject]和构造函数类型提示全部不生效 - 类未被容器管理:比如普通工具类没被任何控制器、服务或注解引用,DI 容器根本不会实例化它
- 代理类未生成:使用
#[Inject]但未触发 AOP 切面(如该类未被路由调用、也未被$container->get()获取),runtime/container/proxy/下无对应代理文件 - PHP 文件未被 AnnotationScanner 扫描:类不在
scan.scan_dirs配置路径下(默认含app/),注解直接被忽略
如何验证 DI 正在工作?
最直接的方式是写一个最小可测片段:
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Contract\RequestInterface;
class TestController
{
#[Inject]
private RequestInterface $request;
public function index()
{
return $this->request->getMethod(); // 若返回 'GET',说明注入成功
}
}
访问该路由,不报 TypeError 或 NullInjectorException,且能正常取值,即确认 DI 已就绪。
真正要关注的不是“怎么开启”,而是“怎么让它正确介入你的类”——重点检查类是否被扫描、是否走容器获取、以及代理类是否存在。这些环节出错,比找“开启开关”更影响实际开发。











