2011-10-27 8 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(array( 'url' => 'Application \ View \ Helper \ Url ') $ map1のコンストラクタparamに変更を加えてテストしましたが、上記の動作を停止させました。次に、map1 => arrayに変更し、すべてが再び動作するようになりました。 – james

答えて

4

ZF2のDI構成は、実際にシグネチャ内の引数の名前で機能します。これがコンストラクタまたは明示的なセッタで行われるかどうかは関係ありません。ただし、設定者はZend\Di\Diで認識されるように "set"で始まる必要があります。

あなたが持っているそうだとすれば、このようなクラス:

<?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とうまく一緒に動作しません。例えば、このような何かを行うことは容易です。