hyperf中@inject注入为null等问题需按扫描路径、注解语法、容器注册三步排查:检查scan.php路径配置及di:proxy日志;确认使用#[inject]或构造函数类型提示;验证@service/@bean注解及dependencies.php绑定。

Hyperf项目中@Inject属性注入后值为null、启动报ContainerException或注入了错误实例,说明DI容器未正确识别目标类或类型绑定缺失,必须按扫描路径、注解语法、容器注册三步闭环排查。
确认类是否被Scan扫描到
打开 config/autoload/scan.php,检查 paths 数组是否包含你定义类的物理目录,例如 UserService 放在 app/Service/ 下则无需额外配置;若放在 common/Service/ 下,必须显式添加 BASE_PATH . '/common'。
路径配置正确后,运行 php bin/hyperf.php di:proxy,观察输出中是否有 Generate proxy for App\Service\UserService 类似日志;没有即代表该类未被扫描器发现。
注意:类文件名不能含空格或特殊符号(如 User Service.php),Finder 会静默跳过;同时确保命名空间与目录结构严格符合 PSR-4,比如 namespace App\Service; 对应的路径必须是 app/Service/。
验证注解写法是否符合 PHP 8+ Attribute 规范
方法一:属性注入必须使用 #[Inject],不能只写类型提示 public UserService $userService; —— 这行代码在 Hyperf 3.0 中完全不触发注入逻辑。
方法二:构造函数注入可选 #[Inject],但更推荐直接写参数类型:public function __construct(private UserService $service) {},此时容器自动完成注入且无需额外注解。
方法三:若使用自定义注解类(如 #[MyInject]),必须继承 PHP 8 原生 Attribute 并声明作用域,例如 #[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_METHOD)];旧版 AbstractAnnotation 继承已彻底失效,删掉所有相关继承和 use 语句。
【关键前提】 所有注解类顶部必须有 use Attribute;,否则 #[Inject] 会被 PHP 解析为普通注释,反射时直接忽略。
检查服务是否已注册进 DI 容器
第一步:确认被注入类自身是否加了 @Service 或 @Bean 注解,并位于 scan.php 配置的路径内;未标记的普通类不会被容器管理,其内部 @Inject 也不会生效。
第二步:若注入的是接口(如 UserServiceInterface),必须在 config/autoload/dependencies.php 中显式绑定实现类:
return [
UserServiceInterface::class => UserService::class,
];
第三步:运行 php bin/hyperf.php di:dump,查看输出中是否存在 UserServiceInterface → UserService 的映射行;不存在说明绑定未加载或文件未被自动加载器识别,此时需执行 composer dump-autoload -o 强制刷新。
第四步:手动测试容器获取能力,在命令行中运行 php bin/hyperf.php shell,输入 $container->get(UserService::class),不报错且返回实例才说明注册成功;若抛出 Entry "xxx" does not exist,则证明类未注册或命名空间拼写错误。











