2011-08-21 72 views
0

我不有很多的PHP的經驗,我會需要一些幫助, 我有一個PHP的MVC框架, 我使用這個類:PHP DI容器

class Registry { 


private $objects; 

private $settings; 

    public function __construct() { 

    } 


    public function iniObject($class, $key) 
    { 
     $this->objects[ $key ] = new $class($this); 
    } 

    public function getObject($key) 
    { 

    return $this->objects[ $key ]; 
    } 

    public function storeSetting($setting, $key) 
    { 

     $this->settings[ $key ] = $setting; 
    } 


    public function getSetting($key) 
    { 

     return $this->settings[ $key ]; 
    } 
} 

然後我通過註冊表來其他類,如:

Class Controller 
{ 

/* 
* @registry object 
*/ 
    protected $registry; 

    function __construct(Registry $registry) 
    { 

    $this->registry = $registry; 
    //i can use any class from my registry class like the logger class below 
    $this->registry->getObject('log')->write_log('debug', "Controller Class Initialized"); 
    } 

/** 
* @all controllers must contain an index method 
*/ 
    public function index() {} 
} 

我開始我的bootstrap.php與

$registry = new Registry(); 

// Instantiate some classes 


$registry->iniObject('Utf8', 'utf8'); 

$registry->iniObject('Uri', 'uri'); 

$registry->iniObject('Router', 'router'); 

i get any method like: 


$registry->getObject('router')->_set_routing(); 

,我也得到一個鑑於這樣的:

$registry->getObject('output')->_display('myview'); 
這樣我可以使用其他類 通過像DI構造註冊表類中的所有類

,效果很好, 一些代碼和快速執行,

我一直在讀關於DI容器和其他東西, 我想知道更好的方法來做到這一點,如果註冊表得到 越來越大,將如何影響框架我的意思是我通過 所有的註冊表,以每個類,有一種方式只傳遞 依賴關係,每個類需要完整的註冊表, 是註冊表使用對象的最佳方式cos允許我 使用任何其他類中的任何類或您的事情這不是很好 方式做到這一點,關於DI容器庫的任何建議, 請我想從更有經驗的php 接受想法做這 多謝

回答

1

雖然我不是專家,我目前在我的項目(https://github.com/beberlei/yadif )。我稍微修改了它以適合我的目的。

儘管依賴注入和註冊表對象允許您從任何地方訪問對象,但我相信不同之處在於,在依賴注入中,依賴對象被實例化並在實例化時傳遞到require對象中。

可以通過構造函數或通過設置所需對象的屬性來完成此傳入。 然後,要點對象和它的依賴關係是鬆散耦合的。

作爲一個簡單的例子,假設我有一個User類,它依賴於Database類。數據庫類將返回一些信息給User類。但是,如果我正在進行單元測試,我想用我自己的一組輸入來測試其上的用戶類。通過依賴注入,我可以輕鬆地將自己的模擬對象(輸入)注入到用戶類中,而無需使用測試數據設置數據庫,並依賴數據庫訪問並將數據返回給我們。

話雖如此,依賴注入不是必須或所有項目所需。例如,複雜的依賴注入框架可能會影響性能或在應用程序中引入不必要的複雜性。

+0

嗨,感謝您的回覆, –

+0

那麼你推薦如果你必須使用很多類,可以需要其他類的方法,我一直在玩symfony DI你有沒有測試過 –

+0

我已經測試過symfony,但是我不喜歡配置風格。我正在使用yadif的修改版本(https://github.com/beberlei/yadif)。話雖如此,如果您覺得symfony可以很好地與您的應用程序配合使用,那麼它也是一個可行的選擇。 – F21

0

您正在注射整個註冊表。我建議你應該簡單地直接注入你的依賴:

class Foo { 
    /** 
    * @Inject 
    * @var MyLogClass 
    */ 
    private $log; 
} 

這樣,你的代碼更易於讀寫,你不必在意你的註冊表。

這可能與例如PHP-DI一起使用,該註釋與您正在使用的DI容器一樣的註釋工作。