2017-12-19 10 views
1

私は依然として、Pimpleを使用して依存性注入デザインパターンのいくつかの面を頭で覆そうとしています。クラスFooに属するコンストラクタまたはセッタ関数を使用して、クラスBarに依存することを確立するという概念を完全に理解しています。Pimple for Dependency Injectionを使用して別のクラスのオブジェクトファクトリを使用するにはどうすればよいですか?

Pimpleファクトリを使用しているときに、Fooに属するメソッドの内部から、クラスBarの複数の新しいインスタンスを正しくインスタンス化する方法があります。

基本的に私はこれと同等のものを達成したい:

Block.php

class Block { 

    private $filepath; 

    public function setFilePath($filepath) { 
      $this->filepath = $filepath; 
    } 

} 

Page.php

class Page { 

    private function newBlock() { 
      //do something here to get $filepath 
      $block = new Block(); 
      $block->setFilePath($filepath); 
      return $block; 
    } 

} 

私は次のように私のコンテナのにきびを使用していますso:

$container = new Container(); 

$container['page'] = $container->factory(function ($c) { 
    return new Page(); 
}); 

$container['block'] = $container->factory(function ($c) { 
    return new Block(); 
}); 

bootstrap.phpのアイデアは、定義された複数のページがあり得ることであり、各ページは、潜在的に複数のブロックで構成されています。各ブロックのプロパティは、Page内のメソッドによって定義されます。そして、完全に分離されたコードを使用する必要があります。

コンテナ全体を依存関係としてページに挿入するのは、実際はサービスロケータの反パターンです。したがって、以下はBADコードです。

class Page { 

    private $container; 

    public function __construct(Container $container) { 
      $this->container = $container; 
    } 

    private function newBlock() { 
      //do something here to get $filepath 
      $block = $this->container['block']; 
      $block->setFilePath($filepath); 
      return $block; 
    } 

} 

PageにDICで定義されているブロックファクトリを使用する方法を教えてください。

答えて

0

したがって、DIコンテナの設定では、コンテナ参照を渡すことができます。だから、あなたはあなたのページクラスのブロッククラスをたくさん使用する必要がある場合、あなたはこれを行うことができます:

$container = new Container(); 

$container['page'] = $container->factory(function ($c) { 
    return new Page($c['block']); 
}); 

$container['block'] = $container->factory(function ($c) { 
    return new Block(); 
}); 

しかし、これはあなたのページクラスのコンストラクタにパラメータを追加しなければならないことを意味:

class Page { 

    private $block = NULL; 

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

    private function newBlock() { 
      //do something here to get $filepath 
      $this->block->setFilePath($filepath); 
      return $this->block; 
    } 

} 

実際には、コンテナ全体を各クラスに渡すのではなく、DIコンテナが必要に応じてオブジェクトを渡せるようにします。

+0

はい、ありがとうございます!それは完璧に働いた。私はちょうど私が見える条件にいなかったそれは信じられないほどシンプルなものになると思った。 乾杯! – Fliggerty

関連する問題