4

Zend または私は、このフレームワーク全体の概念は私にとって新しいものだと言います。いくつかの例は、Module.php でそのコントローラーに関連するテーブルの名前を定義する tablegateway 形式に基づいています。

/* 'MYMODULE\Model\CompanyTable' =>  function($sm) {
                $tableGateway = $sm->get('CompanyTableGateway');
                $table = new CompanyTable($tableGateway);
                return $table;
            },
            'CompanyTableGateway' => function ($sm) {
                $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                $resultSetPrototype = new ResultSet();
                $resultSetPrototype->setArrayObjectPrototype(new Company());
                return new TableGateway('rs_company', $dbAdapter, null, $resultSetPrototype);
            },*/

また、他の例では、Module.php に 3 行のコードしかなく、アダプターについて説明し、__constuct() を介して初期化しています。

'MYMODULE\Model\CompanyTable' =>  function($sm) {
                $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                $table = new CompanyTable($dbAdapter);
                return $table;
            },

そしてクラス __construc() で

public function __construct(Adapter $adapter) {
    $this->adapter = $adapter;
    $this->resultSetPrototype = new ResultSet();
    $this->resultSetPrototype->setArrayObjectPrototype(new Company());

    $this->initialize();
}

私が理解できないのは、それらの両方から選択する方法です。

4

1 に答える 1

11

簡単に言えば、本質的にやりたいことは、サービス (ファクトリ) を Zends サービス マネージャーに登録することです。これにより、アプリケーション内の多くのクラスやモジュール内からサービスにアクセスできるようになります。それらは、必要なときにすぐに使用できるパッケージ済みのオブジェクトのようなものです。ポイントは、彼らが依存するものはすべてすでに注入されているということです。

これで、module.config.php 内から、または Module.php 内からなど、さまざまな方法でサービス マネージャーにサービスを登録できます。選択はあなた次第です。覚えておくべき重要なことは、何かを要求できるようになりたいだけであり、根底にあるすべての詳細について心配する必要がないということです。

デフォルトの Db アダプター: このアダプターは、メイン アプリケーション構成 (global.php および local.php) でデータベース設定を構成している場合、サービス マネージャーに自動的に登録されます。

$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');

これで、このアダプターを使用して、TableGateway やテーブル モデルを使用せずにデータベース機能を実行できます。選択はあなた次第です。コントローラー内からこのサービスを取得したり、モデルに注入したり、ボートを浮かせたりすることができます。

テーブル モデル: 以下のコードで行っていることは、アダプターをテーブル モデルに挿入することです。したがって、アプリケーション内から、サービス マネージャーからテーブル モデル サービスを取得するだけで、アダプターが既に存在します。

'MYMODULE\Model\CompanyTable' =>  function($sm) {
    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
    $table = new CompanyTable($dbAdapter);
    return $table;
},

しかし、あなたのテーブルモデルは何ですか? それは、テーブルのプロトタイプ、テーブルの関数のクラス、またはその両方である可能性があります。技術的には、Table モデルを作成するのはあなたなので、次のようなあらゆる種類の関数を作成し、あらゆる種類のものを注入できます。

'MYMODULE\Model\CompanyTable' =>  function($sm) {
    $table = new CompanyTable();
    $table->setAdapterService( $sm->get('Zend\Db\Adapter\Adapter') );
    $table->setSessionService( $sm->get('MYMODULE\Session') );
    $table->setCustomService( $sm->get('MYMODULE\Custom') );
    return $table;
},

これについて考えてみてください。複数の異なるデータベース アダプタがあり、プライマリ データベースまたはセカンダリ データベースがダウンした場合にフェールオーバーする場合はどうなるでしょうか。利用可能な最初のアダプターを挿入しても、アプリケーションは Table モデルを呼び出すときに違いを認識できません。

TableGateway: TableGateway はまさにその名の通りです。これは、テーブル名 Db Adapter が付けられた Zends TableGateway のインスタンスであり、Table モデルでプロトタイプを作成することもできます。プロトタイピングとは?基本的に、これが行うことは、データベース クエリを作成したときにデータを含む通常の結果セットを返す代わりに、テーブル モデルのインスタンスとしてデータを返すことです。繰り返しになりますが、ゲートウェイをサービス マネージャーに登録するときのポイントは、アダプターやテーブルの名前などを気にすることなく、アプリケーションがゲートウェイを取得して使用できるようにすることです。この例では、Table モデルでプロトタイプ化されていますが、そうである必要はありません。

'CompanyTableGateway' => function ($sm) {
    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
    $resultSetPrototype = new ResultSet();
    $resultSetPrototype->setArrayObjectPrototype(new Company());
    return new TableGateway('rs_company', $dbAdapter, null, $resultSetPrototype);
 },

TableGateway を使用する場合、アダプターの代わりにテーブル モデルにそれを提供するだけでよく、すべての Db 関数にゲートウェイを使用するようにテーブル モデルを記述します。

'MYMODULE\Model\CompanyTable' =>  function($sm) {
    $tableGateway = $sm->get('CompanyTableGateway');
    $table = new CompanyTable($tableGateway);
    return $table;
},

要約すると、あなたの質問に対する答えは次のとおりです。選択はあなた次第です。Db アダプターを単独で使用するか、テーブル モデルおよび/またはテーブル ゲートウェイと組み合わせて使用​​します。うまくいけば、これが役に立ちます!

于 2013-04-11T18:58:50.523 に答える