2011-10-27 177 views
1

对于DI如何与ZF2协同工作,我有点困惑。我花了最近几天试图让我的头靠近它。虽然我已经取得了一些进展,但它仍然困扰着我...Zendframework2依赖注入混淆

使用此(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 \查看\期望有HelperLoader(或继承类)将包含一个DI类将传递数组的setMap()函数。但这似乎并非如此。因为我无法在任何地方找到setMap。

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

感谢任何人的帮助。我很感激这是一个测试版框架,我现在可能得到的答案现在不适用于几个月。但这一切似乎都很重要,我只是没有得到它!

+0

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

回答

4

ZF2的DI配置确实与签名中参数的名称一起工作。如果这是通过构造函数或明确的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