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

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(または継承されたクラス)内に、DIクラスが配列を渡すsetMap()関数が含まれると予想されます。しかし、そうではないようです。setMapがどこにも見つからないので。

私の質問は、最初に、DIがZF2でどのように機能するかについて理解していないことです...しかし、上記のコード(zend \ view \ helperについて)は実際に何をしますか。'map' => array('url' =>'Application \ View \ Helper \ Url')をZend \ View \ HelperLoaderに実際に挿入するとどうなりますか?

誰もが与えることができるどんな助けにも感謝します。私はそれがベータフレームワークであり、私が今得るかもしれない答えが数ヶ月の間に適用されないことを感謝します。しかし、これはすべてかなり基本的なようで、私はそれを理解していません!

4

1 に答える 1

4

ZF2のDI構成は、実際に署名の引数の名前で機能します。これがコンストラクターで行われるか、明示的なセッターで行われるかは関係ありません。ただし、セッターは、によって認識されるように「set」で開始する必要がありZend\Di\Diます。

したがって、このようなクラスがある場合:

<?php

namespace Foo;

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

$bazaと$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 に答える