2011-01-20 10 views
8

単純なMVCスケルトンを作成しようとしていますが、依存関係が残っています。MVCでの依存性注入

これは私が今持っているものです。

$config = new Config(); 
$database = new Database($config); 
$uri = new Uri('article/5'); 
$request = new Request($uri); 
$response = new Response; 
$router = new Router; 
$dispatcher = new Dispatcher($request, $response, $router); 

$dispatcher->dispatch(); // Routing, instantiate controller, execute action, send response 

の質問は:どのように任意のオブジェクトは、すべての依存関係へのアクセスを得ることができますか?

いくつかの例:

  • コントローラは、出力書式オプションを取得するコンフィグレーションが必要な場合があります。
  • Mapperでは、クエリを実行するためにデータベースが必要な場合があります。
  • すべてのコントローラ/ヘルパーは、ログにアクセスする必要があります。
  • ヘルパーは任意の数の依存関係を必要とすることがあります(例:Uri_Helperにはルータが必要です)。

私が考えることができる唯一の可能性はレジストリを使用することですが、これはDemeterの法則に違反します(本当に必要なものを尋ねます)。

答えて

5

factories(秀逸品)を書いてください。これは完全に退屈なので(記事のように)、DIフレームワークを使用することができます。

  • Symfony DIC:Jurajの記事を参照してください。
  • PD
  • Yadif
  • Drip(PHP4):しかし、しばらく更新されていません。
  • また、私はMiskoのブログが非常に面白く、テストを適切に行う方法についてよく読んでいることを指摘したいと思います。特にguide to writing testable codeは必読です。

    P.S:PHPはスクリプト言語であり、できるだけ小さなコードを使用してサイトを高速化する必要があるため、工場を書くべきだと思います。それはいくつかのPHP frameworksの問題です。

    ラスマスLedorf(PHPの発明)の引用:彼らはいくつかにつながる些細 手順のカップルへのWebアプリケーション 開発を減らすように見える ので

    多くのフレームワークは一見魅力的に非常に て見える場合がありますコード生成 と自動スキーマ検出 がありますが、 の柔軟性とパフォーマンスを犠牲にして を達成して以来、これらのショートカットはボトルネックになる可能性があります。 は、何を約束しても、 あなたのアプリケーションを構築しようとしていません。 自分で を構築する必要があります。代わりに、一部の外国 枠組みの中でミスを修正し、直接 要件に適合 リーンと再利用可能なパターンを構築するあなたの時間を過ごすあなたの 環境には適用されません全て ものをリファクタリング によって開始。最後に 私はあなたの 自家製の小さなフレームワークが 時間と悪化を保存し、より良い製品で を終了していることがわかると思います。

    1

    Symfony DICのような依存性注入コンテナを使用することができます。インスタンス化の面倒を見るよりも、コンテナ内のオブジェクト、コンフィグレーション、および配線を定義します。