2011-07-12 25 views
3

私は現在、MVCアプリケーションをPHPで構築しています(フレームワークを使用していません)。私は依存性注入のためにyadif(https://github.com/beberlei/yadif)を使用しています。アダプターと依存性注入

私はログインモジュールを作りたいと思います。アダプタを使用できるはずです。たとえば、MySqlデータベースまたはLDAPディレクトリを使用してログインが認証されるように設定することができます。この設定は管理領域で行われ、データベースに保存されます。

私は抽象アダプタ持っているだろうと想像

:私は、ちょうどそうのようなアダプタを実装し

<?php 
abstract AbstractLoginAdapter{ 
    abstract function login($username, $pass){} 
} 

を:

<?php 
MySQLLoginAdapter extends AbstractLoginAdapter{ 

    public function login($username, $pass){ 
     //do stuff 
    } 
} 

すべてうまくいいとですが、どのように私はインスタンスを作成しないことにアダプターの?通常、依存関係は、コンストラクタを介してyadif用いて注入することになります。

<?php 
class loginController{ 

    private $_adapter; 

    public function __construct(AbstractLoginAdapter $adapter){ 
      $this->_adapter = $adapter; 
    } 
} 

私は具体的なアダプタが注入されるかわからないので、私は手の前に設定してそれを設定することはできません。 DIコンテナがそこに作成され、アプリケーションはフロントコントローラを使用しているため

$builder = new Yadif_Builder(); 
$builder->bind("loginController") 
    ->to("loginController") 
    ->args($SelectedLoginAdapter); 

:Yadifは、私はその後、コンテナに渡す必要がある構成を作成することができます。その後、私はダウンloginControllerオブジェクトにそのコンテナの参照を渡し、その後、私のアダプタをインスタンス化するために、そのコンテナを使用する必要があるなど、このの光で

  • ルーティングオブジェクトを作成しますか?

  • または、loginControllerオブジェクト内に新しいコンテナをインスタンス化してから、アダプタのインスタンスにロードするだけですか?

答えて

2

私は最初のことをします:あなたのコントローラにリファレンスを渡します。アプリケーションでは、単一のDependency Injector Container(DIC)を使用したいと思うでしょう。アクセスする必要があるときはいつでも、新しいDICを作成する必要はありません。それはDICに格納されているオブジェクトの複製につながります。

私はこれがSymfony 2のしくみだと知っています。すべてのコントローラ(および他の多くのクラス)はContainerAwareインターフェイスを実装しています。そのインタフェースには、DICへの参照を渡すために使用される単一のメソッドsetContainer()があります。

+0

ありがとうございました。私はContainerAwareに似た抽象クラスを作成しましたが、これは他のクラスで拡張できます。コンテナ自体は、実行時にそのクラスに自動的に注入されます。これははるかにきれいであるようです。 – F21

2

私はあなたの特定のDIツールについて知りませんが、ビューのDIポイントからあなたは、使用するタイプを指定することになります。コンテナ自体は、設定されたタイプの新しいインスタンス(場合によってはそのタイプのすべての依存関係)をインスタンス化する責任があります。

あなたの例のDIの利点は、LDAPを使用したインストールとMySQL認証を使用するインストールの両方で、異なる設定のまったく同じコードを展開できることです。

1

リファクタ型ヒント("AbstractLoginAdapter")~("MySQLLoginAdapter")

新しい__CLASS__ // Fatal Errorで抽象クラスメソッドを呼び出す場合。