1

我有一些设置器的类,我希望使用设置器注入,但是使用 RuntimeDefinition 它只是没有触发。我最初认为这可能是不可能的,但后来我升级到 Zend 2.1.0 并开始收到我的 Zend\Db\Adapter\Adapter 错误,因为引入了新的 setProfiler() 方法,所以它被注入到其他一些类中,并且它正在尝试对其进行 setter 注入(同时使用默认的 RuntimeDefinition)。我查看了 Adapter 的代码,我发现该代码与我的代码之间的唯一区别是 setProfiler() 方法中有一些带有 @param 的文档注释,所以我认为反射可能使用它。我在我的代码中添加了一些,它也不起作用。显然我错过了一些东西。即使我编译成 DI 定义文件,

'methods' => 
array (
  '__construct' => true,
  'setProfiler' => true,
)

而我的定义是这样的:

'methods' => 
array (
  'setMyValue' => false,
)

如何让 Di 正确识别我的 setter 函数,以便它们习惯于注入必要的值?

4

1 回答 1

1

在深入研究了CompilerDefinition班级的内部之后,我已经弄清楚了。

在 Zend\Db\Adapter\Adapter 的情况下调用 setter 的原因是Profiler\ProfilerAwareInterface.

看来,如果您的类实现了一个接口并且该接口中有一个设置器,那么该设置器将被调用。实现的接口名称与 regex 匹配/\w*Aware\w*/也很重要。

您可以在Ralphschindler 的示例中看到此逻辑的Zend\Di示例

于 2013-02-11T14:08:08.123 回答