17

この「DIコンテナ」の使い方がわかりません。公式サイトに示されている例は私に何も教えてくれません:http://pimple.sensiolabs.org

基本的に、私は単純なサイトを持っています。これは、DBクラス、Cacheクラス、Userクラス、およびコンテンツタイプを処理するいくつかのクラスのセットで構成されています。

これらのクラスはすべて、Pimpleで説明されている「サービス」のようなものであり、各サービスは別のサービスを呼び出すことができる必要があります。現在、他のクラス間でサービスを共有するためにシングルトンのように使用するメインクラスでサービスをインスタンス化しています。

私が読んだことから、Pimpleはまさにこの種のことをします、しかし私はそれをどのように使うのですか?:s

4

2 に答える 2

19

http://phpmaster.com/dependency-injection-with-pimple/に、PimpleをDICとして使用する方法を説明するチュートリアルがあります。

別の(ただし必ずしも推奨されない)アプローチは、コンテナーを必要とするすべてのコンポーネントにコンテナーを注入し(たとえば、ServiceLocatorのように使用する)、Pimpleからオブジェクトを取得するためにドキュメントに記載されていることを実行することです。

class SomeClassThatNeedsSession
{
    private $session;
    public function __construct(Pimple $container) 
    {
        $this->session = $container['session'];
    }
}

つまり、必要なものをフェッチするだけで、Pimpleがそのオブジェクトの存続期間を処理します。たとえば、オブジェクトを作成する必要があるか、再利用する必要があるかなどです。OffsetGetはArrayAccess、配列のようなオブジェクトにアクセスできるようにするインターフェイスの一部です。そのため、Pimpleを実行$container['foo']すると、fooにクロージャーが定義されているかどうかがチェックされ、それに応じてサービスがアセンブルされます。

にきびは、ラムダとクロージャに関するブログ投稿の結果であり、それがどのように機能するかをよりよく理解するために読むことをお勧めします。

于 2012-05-21T12:38:50.490 に答える
4

私はPimpleを知りませんが、私が知っているDIエンジンは、インスタンス化をあなたの手から取り除きます。オブジェクトは、依存関係のインスタンスを作成しません。代わりに、DIエンジンがそれらを作成し、要求に応じてそれらを実行します。

したがって、PHPコードが新しいインスタンスを作成している場合は、コードがDIエンジンを取得し、そこから依存関係を要求するように変更する必要があると思います。

于 2012-05-21T12:35:33.720 に答える