2

現在の(2.1)ZF2ユーザーガイドの「データベースとモデル」の章にコードスニペットがありますが、わかりません:

(ブロック "ServiceManager を使用してテーブル ゲートウェイを構成し、AlbumTable に挿入する")

...
class Module
{
    // getAutoloaderConfig() and getConfig() methods here

    // Add this method:
    public function getServiceConfig()
    {
        return array(
            'factories' => array(
                'Album\Model\AlbumTable' =>  function($sm) {
                    $tableGateway = $sm->get('AlbumTableGateway');
                    $table = new AlbumTable($tableGateway);
                    return $table;
                },
                'AlbumTableGateway' => function ($sm) {
                    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                    $resultSetPrototype = new ResultSet();
                    $resultSetPrototype->setArrayObjectPrototype(new Album());
                    return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
                },
            ),
        );
    }
}

変数$smは後で のインスタンスになりますZend\ServiceManager\ServiceManagerよね?メソッド Zend\ServiceManager\ServiceManager#get(...) は、最初の引数としてクラス名を想定しています。ただし、クラス AlbumTableGateway はありません。モデル クラスは、Album\Model\Album と Album\Model\AlbumTable の 2 つだけです。

ガイドの間違いですか、それともコードの理解が間違っていますか?

ありがとう

4

1 に答える 1

3

これを考える最良の方法は、ServiceManagerのget()メソッドがクラス名ではなくキー値を受け取ることです。キー値は、クラスインスタンスが返される結果となるものにマップする必要があります。

キーがinvokablesセクション内にある場合、ServiceManagerは、それがクラス名であると想定して、キーが指す文字列をインスタンス化しようとします。

'invokables' => array(
    'some_name' => 'My\Mapper\SomeClassName',
),

キーがfactoriesセクション内にある場合、ServiceManagerはキーが指すコールバックを実行し、オブジェクトインスタンスが返されることを期待します。

'factories' => array(
    'some_name' => function($sm) { return new \My\Mapper\SomeClassName(); },
),

一般に、クラスをインスタンス化する以上のことを行う必要がある場合は、ファクトリを使用します。通常、別の依存関係を使用してクラスを設定する必要があります。クラスをインスタンス化する必要があるだけの場合は、呼び出し可能オブジェクトを使用してください。

于 2013-02-25T08:56:11.763 に答える