PHP使用Dice依赖注入容器时构造函数未触发问题求助
我来帮你排查这个问题!根据你提供的代码和描述,咱们一步步分析可能的原因和解决方案:
1. 确保通过Dice容器创建实例,而非直接new
你提到手动实例化能正常执行,但依赖注入没效果——首先要确认你是通过Dice的create()方法获取Configuration实例,而不是自己直接new。如果直接用new App\Providers\Configuration(),Dice的规则完全不会生效。
正确的容器实例化方式:
// 用Dice创建实例,才会应用你配置的constructParams $config = $dice->create("App\Providers\Configuration");
如果Configuration是作为依赖注入到其他类中,也要确保通过容器创建那个依赖类,比如:
class FooService { public function __construct(App\Providers\Configuration $config) { // 这里的$config会由Dice自动注入,应用你的构造参数规则 } } // 必须通过容器创建FooService,才能触发依赖解析 $foo = $dice->create("FooService");
2. 检查类名的完全匹配
注意到你手动实例化的代码写的是:
$config = new \App\Providers\Config("test");
但你的类名是App\Providers\Configuration——这里存在类名不一致的问题!Dice是严格按照完全限定类名匹配规则的,如果规则里写的是Configuration,但实际你要实例化的是Config(或者反过来),规则肯定不会生效。
请确保:
- 容器规则中的类名和实际类的完全限定名完全一致
- 手动实例化的代码也使用正确的类名(你手动实例化能执行,说明可能你的实际类名是
Config,而容器规则里写错成Configuration了?仔细检查下)
3. 验证Dice规则是否被正确添加
有时候可能不小心在添加规则后重新初始化了Dice实例,导致之前的规则丢失。你可以在添加规则后,打印规则确认是否生效:
$dice = new \Dice\Dice; $configRule = [ "constructParams" => ["config_directory_here"], ]; $dice->addRule("App\Providers\Configuration", $configRule); // 打印规则,确认constructParams存在 var_dump($dice->getRules("App\Providers\Configuration"));
如果输出中没有constructParams字段,说明规则没成功添加,检查类名拼写、是否重复创建了Dice实例。
4. 检查命名空间与文件系统的大小写匹配(Linux环境下)
如果你的项目运行在Linux系统上,PHP的命名空间是区分大小写的,必须和文件系统的文件名完全匹配。比如App\Providers\Configuration对应的文件必须是src/Providers/Configuration.php(首字母大写),如果文件名是小写的configuration.php,自动加载可能会找不到类,但手动实例化如果是在同一个文件里可能没问题?不过你说自动加载已配置且手动实例化正常,这个可能性较低,但可以排查下。
按照上面的步骤逐一排查,应该能解决构造参数不生效的问题。
内容的提问来源于stack exchange,提问作者user5405648

