2011-01-20 204 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 

的問題是:任何物體如何可以訪問任何依賴性?

一些例子:

  • 控制器可能需要配置得到的輸出格式選項。
  • 映射器可能需要數據庫來執行查詢。
  • 任何控制器/幫助程序都需要訪問日誌。
  • 助手可能需要任何數量的依賴項(例如:Uri_Helper需要路由器)。

我能想到的唯一可能是使用註冊表,但這違反了德米特法(問你真正需要什麼)。

回答

5

你寫factories(excellen文章)。這可能是無聊的(像文章提到),所以你可以使用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。您可以在容器內定義對象,配置和接線,而不需要實例化。