2

社内で MVC PHP フレームワークを構築しましたが、現在は DI コンテナーの実装に苦労しています。私は Pimple を DiC として採用し、Chris Hartjes の本The Grumpy Programmer's Guide To Building Testable PHP Applicationsを読みました (これは非常に優れた刺激的な読み物であり、強くお勧めします!)。 TDDについてもっと理解するために。とにかく、フレームワークのコアで DI を取得した場合、どのように定義を設定し、それを渡す必要がありますか。

  1. コンテナーを注入します (ユーザーが作成したコントローラーまでアプリケーション オブジェクトを注入します)。-間違っている
  2. dev-user に Bootstrap への「入力」を強制する -間違っている
  3. シングルトン -非常に間違っている
  4. オブザーバー パターン (オブザーバーに取り付けられた DiC。DiC のフロント エンドとしてのオブザーバー) - ?(おそらく最悪のアイデア :D )

次に、依存関係を作成せずに、フレームワーク全体でコア DiC を使用できるようにする方法 (たとえば、構成オブジェクトを挿入するため)、ユーザーにコーディングを強制したり、XML/JSON などを作成するオーバーヘッドを追加したりする必要はありません。

PS: ** Inversion-of-Control (IoC) と Service Locator については、多くの回答が得られると思います。それらを実装する方法を正確に理解できないようです..簡単な/基本的なガイドを参照してください。

4

1 に答える 1

2

(免責事項、私はPHP-DIの開発者です)

私はあなたの質問をよく理解していません.MVCフレームワークを完全に制御できれば、DIとDICの使用は非常に簡単になるはずです. 以下は、PHP-DI ホームページの DI の紹介のコピーです。

  • アプリケーションには FooController が必要なので:
  • アプリケーションはコンテナから FooController を取得するため、次のようになります。
    • コンテナが SomeRepository を作成する
    • コンテナは BarService を作成し、それに SomeRepository を与えます
    • コンテナーは FooController を作成し、それに BarService を提供します
  • アプリケーションが FooController を呼び出す
    • FooController が BarService を呼び出す
      • BarService が SomeDependency を呼び出す
        • SomeRepository は何かを行います

コンテナはすべてのオブジェクト (オブジェクト グラフ) の作成を担当し、非フレームワーク コード (コントローラ、サービスなど)はコンテナを呼び出すことなく機能します。

では、コア DiC をフレームワーク全体で利用可能にする方法は?

フレームワーク全体で使用可能にしないでください。

各コンポーネント (オブジェクト) には、その依存関係が注入されている必要があります (たとえば、コンストラクター内)。コンテナーはそれらを注入し (コンテナーがすべてのオブジェクトを作成するため)、コンテナーはアプリケーションのルート(フロント コントローラー) で呼び出す必要があります。


例: コントローラーに Configuration オブジェクトを挿入します。

class MyController {
    private $configuration;

    public function __construct(Configuration $configuration) {
        $this->configuration = $configuration;
    }
}

そのコントローラーを作成するのが DIC の役割であるため、構成オブジェクトを挿入します。

また、構成オブジェクト全体を注入する必要はないと思いますが、関心のある値だけを注入する必要があります (ただし、それは別の議論です)。

また、コントローラーの書き方について質問がある場合は、次の記事を読んでください:サービスとしてのコントローラー? .

于 2013-10-19T21:12:49.107 に答える