Zend Framework 2依赖注入混淆

时间:2011-10-27 11:01:26

标签: php configuration dependency-injection zend-framework2

我对DI如何与ZF2一起工作有点困惑。我花了最近几天试图绕过它。虽然我取得了一些进展,但仍然让我感到困惑......

使用这个(http://akrabat.com/getting-started-with-zend-framework-2/)教程,我设法掌握了以下内容:

'di' => array('instance' => array(
        'alias' => array(
            'album' => 'Album\Controller\AlbumController',
        ),
        'Album\Controller\AlbumController' => array(
            'parameters' => array(
                'albums' => 'Album\Model\Albums',
            ),
        ),

有效,因为在我们的Album Controller类中我们有一个setAlbum函数。所以当DI类调用setAlbums函数并将其传递给'Album \ Model \ Albums'类时。

很好,没问题..

现在让我们看看这个(它出现在zend网站的骨架应用程序中)

            'Zend\View\HelperLoader' => array(
            'parameters' => array(
                'map' => array(
                    'url' => 'Application\View\Helper\Url',
                ),
            ),
        ),

现在我希望在Zend \ View \ HelperLoader(或一个继承的类)中包含一个set类()函数,DI类将传递一个数组。但事实并非如此。因为我无法在任何地方找到setMap。

我的问题首先是我不了解DI与ZF2的工作方式...但是上面的代码(关于zend \ view \ helper)实际上是做什么的。我的意思是注入'map'=>数组('url'=>'Application \ View \ Helper \ Url')实际进入Zend \ View \ HelperLoader吗?

感谢任何人都能给予的帮助。我很欣赏它是一个beta框架,我现在可以得到的答案在几个月后不适用。但这一切似乎都很基础,我只是没有得到它!

1 个答案:

答案 0 :(得分:4)

ZF2的DI配置确实与签名中的参数名称一致。如果使用构造函数或显式setter完成此操作并不重要。但是,setter必须以“{”开头,才能被Zend\Di\Di识别。

所以,如果你有这样的课程:

<?php

namespace Foo;

class Bar
{
    public function __construct ($baz) {}
    public function setSomethingElse ($bat) {}
}

您可以同时注入$baz$bat

'di' => array(
    'instance' => array(
        'Foo\Bar' => array(
            'parameters' => array(
                'baz' => 'Something\Here',
                'bat' => 'Something\There',
            ),
        ),
    ),
)

对于Zend\Di,函数名称的确切含义并不重要,只要它以“set”开头且参数名称正确即可。这就是Foo\Bar::setSomethingElse($bat)就像Foo\Bar::setBat($bat)一样工作的原因。

请确保正确命名您的参数。例如,很容易做到这样的事情:

<?php

namespace Foo;

class Bar
{
    public function setCacheForBar ($cache) {}
    public function setCacheForBaz ($cache) {}
}

但这与Zend\Di一起不能很好地发挥作用。