【问题标题】:Zendframework2 Dependency Injection ConfusionZendframework2 依赖注入混淆
【发布时间】:2011-12-16 10:16:21
【问题描述】:

我对 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 实际上是做什么的?

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

【问题讨论】:

  • 我想我现在已经解决了(主要是......) func_get_args 用于获取构造函数的参数名称(即 $map=null)。所以在我上面的代码中 ('map' => array('url' => 'Application\View\Helper\Url',) 是说 $map 的构造函数将是 array(array('url' => 'Application\ View\Helper\Url') 我通过将构造函数参数更改为 $map1 来测试这一点,导致上述停止工作。然后我将其更改为 'map1' => 数组,一切又开始工作了..

标签: php configuration dependency-injection zend-framework2


【解决方案1】:

ZF2 的 DI 配置确实适用于签名中的参数名称。这是使用构造函数还是显式设置器完成的并不重要。但是,setter 必须以“set”开头才能被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 一起使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 2017-03-10
    相关资源
    最近更新 更多