如何让Zend Di在RuntimeDefinition中使用setter注入

时间:2013-02-07 16:48:10

标签: zend-framework2

我有一些使用setter的类,我想要使用setter注入,但是使用RuntimeDefinition它只是不会触发。我最初认为它可能不可能,但随后我升级到Zend 2.1.0并开始在我的Zend \ Db \ Adapter \ Adapter中出现错误,因为引入了一个新的setProfiler()方法而被注入其他类中它正在尝试对其进行setter注入(使用默认的RuntimeDefinition)。我查看了Adapter的代码,我看到的代码和我之间的唯一区别是setProfiler()方法中有一些@param的doc注释,所以我想也许反射使用它。我在代码中添加了一些内容,但它也无效。显然我错过了一些东西。即使我编译成DI定义文件,我也可以看到Zend \ Db \ Adapter \ Adapter在其定义下有这样的条目:

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

虽然我的定义如下:

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

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

1 个答案:

答案 0 :(得分:1)

在深入研究CompilerDefinition课程的内部结构之后,我已经弄明白了。

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

看来如果你的类实现了一个接口,并且该接口中有一个setter,那么就会调用setter。实现的接口名称必须是matches the regex /\w*Aware\w*/

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