0

私は、さまざまな理由でさまざまなモジュールでアクセスされる多くのテーブルがDBにある大規模なプロジェクトに取り組んでいます。Service Managerそこで、モデルをインスタンス化して要求に応じて返すFactoryクラスを指すようにを使用してTableGateway、モデルの遅延読み込みを効果的に行うというアイデアを思いつきましたTableGateway

ただし、ServiceManagerのファクトリが遅延ロードされているのか、ServiceManagerでインスタンス化されているのかはまだわかりません。

つまり、構成ファイルにこのようなものがある場合

array(
    'service_manager' => array(
        'factories => array(
            'giftcard_table' => 'Giftcard\Factory\GiftcardTableFactory',
        ),
    ),
);

Giftcard\Factory\GiftcardTableFactory電話をかけるたびにの新しいインスタンスが作成されます$sm->get('giftcard_table')か?ServiceManagerそれとも、これは、呼び出すかどうかに関係なく、すべてのHTTPリクエストの開始時にインスタンス化されるもの$sm->get('giftcard_table')ですか?

4

1 に答える 1

4

get工場は、サービスマネージャーの方法で要求するとインスタンス化されます。このメソッドはcreateメソッドを呼び出し、次に、ファクトリを要求する場合はcreateFromFactoryメソッドを呼び出します。最後のリンクで強調表示されている行のように、要求されたときに実際にファクトリをインスタンス化していることがわかります。あなたが見ることができるのは、それが工場を保管しているということです。これは、サービスマネージャからフェッチされたサービスがデフォルトで共有されるためです。共有とは、後続のリクエストで同じインスタンスが返されることを意味します。あなたはそれをキャッシュのように考えることができます。必要に応じてこれを無効にして、特定のサービスのインスタンスがすべての要求で作成されるようにすることができます。

構成ファイルの場合:

// Some configuration omitted
'service_manager' => array(
    /* ... */

    'shared' => array(
        'MyFactory' => false,
    )
);

サービスマネージャオブジェクトにアクセスするには、次のようにします。

$service_manager->setShared('MyFactory', false);

少し前に、サービスマネージャーに関する記事を書きました。この記事には、共有サービスの概念に関するセクション(下部近く)が含まれています。これは、役立つ場合があります。

于 2013-03-02T19:32:19.017 に答える