我对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框架,我现在可以得到的答案在几个月后不适用。但这一切似乎都很基础,我只是没有得到它!
答案 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
一起不能很好地发挥作用。