1

我对 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',
            ),
        ),

之所以有效,是因为在我们的专辑控制器类中,我们有一个 setAlbum 函数。因此,当 DI 类将调用该 setAlbums 函数并将其传递给 'Album\Model\Albums' 类时。

好吧,没问题。。

现在让我们看看这个(它来自 zend 站点的框架应用程序)

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

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

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

感谢任何人都可以提供的任何帮助。我很欣赏这是一个测试版框架,我现在可能得到的答案在几个月内都不会适用。但这一切似乎都很基本,我就是不明白!

4

1 回答 1

4

ZF2 的 DI 配置确实适用于签名中的参数名称。这是使用构造函数还是显式设置器完成的并不重要。但是,setter 必须以“set”开头才能被Zend\Di\Di.

因此,如果您有这样的课程:

<?php

namespace Foo;

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

您可以同时注入 a$baz和 a $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.

于 2011-12-13T09:31:26.050 回答