1

Zend Framework 2ユーザーガイドのアルバムの例では、モデルは次のように構成されています。

<?php
namespace Album;

// Add these import statements:
use Album\Model\Album;
use Album\Model\AlbumTable;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;

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);
                },
            ),
        );
    }
}

変数$smZend\ServiceManager\ServiceManagerオブジェクトです。しかし、それはどのように/いつ/どこで作成/初期化されますか?

編集:

私が知りたいのは、どのように/どこで$sm その値を取得するか(そしてServiceManagerオブジェクトになるか)です。

4

1 に答える 1

1

サービスマネージャからサービスを取得するとき、それがファクトリの場合、サービスの作成を担当する呼び出し可能オブジェクトに最初のパラメータとしてそれ自体のインスタンスを渡します。これは通常、クロージャ(例のように)またはファクトリクラスのcreateServiceメソッド。

これは、工場の場合、https://github.com/zendframework/zf2/blob/master/library/Zend/ServiceManager/ServiceManager.php#L859のコードによって行われます。

基本的に、モジュールでは、提供したクロージャを呼び出すことによってこれらのサービスが作成されることをServiceManagerに伝えています。初めてServiceManagerにget()それらの1つを要求すると、それがファクトリ(configのfactoriesキーで提供された)であると判断し、それがクロージャであるかFactoryInterface(ファクトリクラス)のインスタンスであるかを判断します。最後に適切に呼び出して、サービスをインスタンス化します。

于 2013-03-21T14:50:34.850 に答える