1

Zend Framework プロジェクトに Symfony2 依存性注入コンテナーを実装しましたが、アプリケーションの MVC レイヤーで正常に動作します。ブートストラップで DIC を初期化し、次のように呼び出してどこからでもアクセスできます。

Zend_Controller_Front::getInstance()->getParam('bootstrap')->getDic()

問題は、私のアプリケーションの一部が Zend Framework アプリケーション/MVC レイヤーを利用していないことです。たとえば、私のCLIツール。そこで新しいDICを完全に初期化できましたが、それはBootstrapファイルからのコピーペースト作業であり、今後の問題(DRY原則など)を求めています

たとえば、DIC を で、Zend_Registryまたは静的メソッドによって呼び出されるシングルトンとして使用できるようにすることは、より良い解決策ですか?DIC::getInstance()

レジストリとシングルトンが悪いものと見なされていることは知っていますが、DIC はアプリケーションの非常に高レベルの部分であるため、それを悪いものにする問題に遭遇することはおそらくないでしょう。

これは良い解決策ですか、それともグローバルにアクセス可能な DIC を実現するためのより良い方法はありますか?

4

2 に答える 2

1

私は過去に Pimple (Symfony の所有者である Fabien Potencier によって作成された) を使用してこれを達成しまし

Pimple は PHP 5.3 用の小さな Dependency Injection Container で、たった 1 つのファイルと 1 つのクラス (約 50 行のコード) で構成されています。

これを ZF1 アプリケーションと組み合わせる方法は次のとおりです。

  1. アプリケーションのブートストラップに新しい Pimple コンテナを作成します
  2. すべてのサービスを適切な依存関係で宣言します
  3. コントローラーまたは CLI ツールを介して DIC にアクセスする
  4. DIC を介してサービスにアクセスする

サービスが適切に宣言されている (コンストラクターを介して依存関係を注入している) 場合、コントローラーまたは CLI ツールの外部で DIC にアクセスする必要はありません。

基本コントローラ クラスを使用して、次の方法で DIC に簡単にアクセスします$this->container

abstract class MyApp_Controller_Action extends Zend_Controller_Action
{
    protected $container;

    public function init()
    {
        $this->container = Zend_Controller_Front::getInstance()
                               ->getParam('bootstrap')->getDic();
    }
}

DIC を CLI ツールで使用するには:

  1. 拡張Zend_Applicationして CLI アプリケーションを作成する
  2. run()MVC スタックがブートストラップしないようにオーバーライドする
  3. CLI ツールを作成するときに、コンストラクターを介して DIC を挿入します

基本コマンド クラスを使用して、次の方法で DIC に簡単にアクセスできます$this->container

abstract class MyApp_Command
{
    protected $container;

    public function __construct($container)
    {
        $this->container = $container;
    }
}
于 2012-09-04T08:44:58.173 に答える
1

CLI ファイルのブートストラップ リソースにアクセスするには、アプリケーションの部分的なブートストラップを実行できます。

これ (public/index.php) を実行してアプリケーション全体をブートストラップする代わりに:

$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()
            ->run();

これを行うことができ、必要なリソースのみをブートストラップします:

$app = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH .  '/configs/application.ini'
);

// Selectively bootstrap resources:
$app->bootstrap('db');
$app->bootstrap('log');
$app->bootstrap('autoload');
$app->bootstrap('config');
$app->bootstrap('di');

それらを正しい順序で初期化する必要があります (たとえば、ログ用の DB ライターがある場合は、ロギング コンポーネントの前に DB をロードする必要がある場合があります)。

そこから、ブートストラップの一部を呼び出すことができます (DI コンポーネントの場合は、を呼び出すことができ$app->getBootstrap()->getContainer()ます。ブートストラップで使用可能なすべてのメソッドにアクセスできます。

于 2012-09-04T15:26:55.527 に答える