0

私はよくグーグルで検索し、この件についてできる限り読んだことがありますが、ここを含め、どこにも私の質問に対する直接の答えが見つかりません。私の ZF2 アプリケーションは、およそ 7 つの異なるモジュールで構成されています。モジュールのうち 5 つは、同じデータベース構成にアクセスする必要があります。アプリケーション自体には、約 124 の異なるテーブルを持つデータベースがあります。したがって、ここでの考え方は、セットアップを考慮して最小量のコードを記述するための適切な解決策を見つけることです。

私がやろうとしているのは、DB とやり取りするための特定のクラスを作成することです。ビジネスロジックがモジュールに保持されている場所と、すべてをより抽象的で維持しやすいようにコントローラーに注意してください。つまり、コントローラー X は、たとえば (Application\Model\DBInterface) の新しいインスタンスを作成し、モデル関数を使用して、挿入、削除、更新、結合、選択などを行うことができるはずです。このようにしたい理由は、インストールされているすべてのモジュールが同じインターフェースを使用できるようにするためです。したがって、必要なのは、DB (現在は module.config.php + local.php(username / pw) 内) の構成を取得して Application\Model\DBInterface dbConfig 変数に渡す方法の例です。

または、そのような方法が存在する場合は、Application\Model\DBInterface から構成を取得する可能性があります。

上記のいずれも不可能な場合は、db の詳細について ini ファイルを読み取り、その方法で db アダプターをインスタンス化することで、いつでも古い方法に戻ることができます。

コントローラーは $db = new \Application\Model\DBInterface() を使用するだけなので、コントローラーには何も注入しないことに注意してください。したがって、コントローラーへの注入はまったく意味がありません。

これを行うためのより良い方法はありますか/最適化されていますか/私はそれを完全に間違っていますか? 詳細を共有できる人は誰でもお願いします。私はすでにこれにあまりにも多くの時間を費やしており、間違いなく助けが必要です.

4

1 に答える 1

4

わかりましたので、@ Ocramius は、私の誤解が何であるかinitializersを教えてくれて、それを理解するのに少し役立ちました。したがって、ここに問題に対するおそらく有効な解決策があります。あなたの問題についての私の理解は次のとおりです。

「DbInterface を実装するすべてのモデルの DbAdapter セットを取得する方法」 . これはあなたがそれを行う方法です:


ステップ 1:invokablesを実装するすべてのクラスを作成しますDbInterfacefactoryデフォルトZend\Db\Adapter\Adapterの を作成してからinitializerDbInterface

Module.phpgetServiceConfig()

return array(
    'invokables' => array(
        'application-model-one' => 'Application\Model\One',
        'application-model-two' => 'Application\Model\Two'
    ),
    'factories' => array(
        'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory'
    ),
    'initializers' => array( 
        'DbInterfaceInitializer' => function($instance, $sm) {
            if ($instance instanceof \Application\Model\DBInterface) {
                $instance->setDbAdapter($sm->get('Zend\Db\Adapter\Adapter'));
            }
        },
    )
)

Zend\Db\Adapter\Adapterは、最上位の構成配列キーを'db'使用して dbParams を自動的に挿入します。


ステップ 2:インターフェイスを実装するクラスを作成する

Application\Model(One|Two|N).php

namespace Application\Model;

class One implements DbInterface, \Zend\Db\Adapter\AdapterAwareInterface
{
    /**
     * @var \Zend\Db\Adapter\Adapter $dbAdapter
     */
    protected $dbAdapter;

    public function setDbAdapter(\Zend\Db\Adapter\Adapter $dbAdapter) {
        $this->dbAdapter = $dbAdapter;
    }

    public function getDbAdapter() {
        return $this->dbAdapter;
    }

    // More of your business logic or data here
}

ステップ 3:コントローラーから ServiceLocator を使用してこれらのクラスにアクセスする

SomeController.phpsomeAction()

$dbOne = $this->getServiceLocator()->get('application-model-one');
$dbTwo = $this->getServiceLocator()->get('application-model-two');
// Adapter will automatically be injected

invokableServiceManager から にアクセスすると、initializerが呼び出されます。その後、イニシャライザは自動的に を呼び出しZend\Db\Adapter\Adapter、構成キーからパラメータを取得します。'db'


チュートリアル アプリケーションと samsonasik のブログ : ServiceManager Cheat-Sheetから詳細情報を取得できます。

于 2013-02-13T07:56:20.817 に答える