5

ZF2スケルトンに基づいて、新しいプロジェクト用に新しいZF2アプリケーションのセットアップを開始したばかりで、モデルに関するチュートリアルを見ています。

tl; dr:モデルをより高いレベル(/ moduleの外側)のどこかに配置して、複数の異なるモジュール間でモデルを共有するにはどうすればよいですか?

次のようにいくつかのモジュールを設定します。

/
/module/ModuleName
/module/ModuleName/config
/module/ModuleName/src
/module/ModuleName/src/ModuleName

フォルダを設定しようと/module/ModuleName/src/ModuleName/Model/TableName.phpしていましたが、他のモジュールでもそのテーブルにアクセスする必要があることに気付きました。だから私は何をすべきですか?

Modelsフォルダーを配置する必要がありますか、/module/Modelそれともモジュールとして扱われることになります。つまり、site.com / model(現在の構成に基づく)。

モデルをコピーして場所間で貼り付ける必要がありますか?/vendor/library/Company/Modelモデルをどこかに貼り付ける必要がありますか?このためのベストプラクティスがあるかどうかはよくわかりません。

質問2:チュートリアルでは、ServiceManagerを使用して、同じインスタンスを使用するようにデータベースモデルをインスタンス化することも提案しています。5つのコントローラーを備えたモジュールがあり、各コントローラーが完全に別々のテーブル(たとえば、それぞれ4つのテーブル)にアクセスしている場合はどうなりますか?(そのモジュール内の他のコントローラーの場合)ページの読み込みごとに16個のテーブルを冗長的に初期化するように思われます。単一のテーブルの初期化により、ページロードに55ミリ秒が追加されます。これを回避する方法はありますか?チュートリアルがテーブルゲートウェイを初期化するために行うことに基づいて、構成をコントローラーのアクションに移動する方法がわかりませんか?

4

1 に答える 1

8

1)

アプリケーション内の任意のモジュールの任意のモデルを使用できるため、それらを「共有」できます。たとえば、ServiceManager を使用して、プロジェクト内のモデル (およびその他のクラス) のインスタンスを取得できます。

サービス マネージャーの構成:

'factories' => array(
    'AuthService' => function($sm) {
        $auth = new \Zend\Authentication\AuthenticationService();

        return $auth;
    },
    'RoleMapper' => function($sm) {
        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
        $mapper = new \Application\Mapper\RoleMapper;
        $mapper->setDbAdapter($dbAdapter);
        $mapper->setEntityPrototype(new \Application\Model\Role);
        $mapper->setHydrator(new \Application\Model\RoleHydrator);

        return $mapper;
    },
    'UserMapper' => function($sm) {
        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
        $mapper = new \MyModule\Mapper\UserMapper;
        $mapper->setDbAdapter($dbAdapter);
        $mapper->setEntityPrototype(new \MyModule\Model\User);
        $mapper->setHydrator($sm->get('UserHydrator'));

        return $mapper;
    },
    ....

ご覧のとおり、複数のモジュールからクラスを定義できます。ただし、通常は、モジュールごとに個別の ServiceManager 構成を定義するだけです。

次のように、Application モジュール内で「UserMapper」のインスタンスを作成することを妨げるものは何もありません。

一部のコントローラー:

$this->getServiceLocator()->get('UserMapper');
// Or even grab Zend libraries like this
$this->getServiceLocator()->get('AuthService');

ServiceManager を使用すると、問題のある他のモジュール内の任意のモジュールからクラスのインスタンスを取得できます。

2)

サービスマネージャーは、リクエストするまで実際には何もインスタンスを作成しないため、提案したようにオーバーヘッドはありません。

上記の例から、最初にインスタンスを要求するまで、実際にはインスタンスは作成されません。

$this->getServiceLocator()->get('UserMapper'); // instance now created.

たとえば、サービス マネージャーに「RoleMapper」を要求しない場合、インスタンスは作成されません。

于 2013-02-26T08:48:32.357 に答える