2012-09-04 45 views
1

我在我的Zend Framework項目中實現了Symfony2依賴注入容器,它在我的應用程序的MVC層中正常工作。我已經初始化DIC在我的引導,並可以通過調用任何地方訪問它:從任何地方訪問DI容器

Zend_Controller_Front::getInstance()->getParam('bootstrap')->getDic() 

的問題是,有沒有使用Zend Framework的應用/ MVC層我的應用程序的某些部分。例如,我的CLI工具。我可以在那裏完美初始化一個新的DIC,但這只是從Bootstrap文件中複製粘貼的工作,它要求在路上遇到麻煩(DRY原則等)

這是一個更好的解決方案,使我的DIC可用例如Zend_Registry或作爲一個單例調用靜態方法DIC::getInstance()

我知道註冊表和單身人士被認爲是不好的東西,但DIC是應用程序的高層次部分,我可能永遠不會遇到使其成爲壞事的問題。

這是一個很好的解決方案還是有更好的方法來完成全球可訪問的DIC?

回答

1

我在過去使用Pimple(由Symfony的所有者Fabien Potencier創建)實現了這一點。

Pimple是PHP 5.3的一個小型依賴注入容器,它只包含一個文件和一個類(約50行代碼)。

這裏是我與我的ZF1應用加上它:

  1. 創建一個新的疙瘩容器到應用程序的引導
  2. 聲明所有的服務與適當的依賴
  3. 訪問DIC通過您的控制器或CLI工具
  4. 通過DIC訪問服務

如果您的服務已被正式聲明(通過其構造函數注入依賴項),則不必訪問控制器或CLI工具外部的DIC。

使用控制器基類來輕鬆地通過$this->container訪問DIC:

abstract class MyApp_Controller_Action extends Zend_Controller_Action 
{ 
    protected $container; 

    public function init() 
    { 
     $this->container = Zend_Controller_Front::getInstance() 
           ->getParam('bootstrap')->getDic(); 
    } 
} 

爲了使用DIC到您的CLI工具:

  1. 擴展Zend_Application創建您的CLI應用程序
  2. 替代run()以防止MVC堆棧引導
  3. 在創建CLI工具,通過它的構造

使用基本命令類方便的通過$this->container訪問DIC注入DIC:

abstract class MyApp_Command 
{ 
    protected $container; 

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

我想你不明白我」 m問,我沒有問題訪問我的DIC在MVC堆棧或使用它的任何類。我已經做了相同的處理你的疙瘩,而是與Symfony2容器。問題是,當我不使用MVC堆棧bootstrap沒有使用(例如CLI工具),因此DIC沒有初始化,這讓我想知道Bootstrap是否真的是我的情況下初始化它的正確位置。 – ChrisR

+0

爲什麼不初始化引導你的CLI工具?創建一個擴展'Zend_Application'並覆蓋'run的應用程序類()'來禁用'Zend_Front_Controller'引導。然後,您將能夠使用您的引導資源,而無需MVC堆棧。 – Florent

+0

是的,但是因爲我沒有FrontController,因此訪問DIC不可能和'Zend_Controller_Front :: getInstance()'一起使用。這就是爲什麼我問是否有更好的選項來訪問我的應用程序的CLI部分中的DIC(註冊表,單身人士...),也可能在我的MVC堆棧中。 – ChrisR

0

要在你的CLI訪問您的引導ressources文件你可以去做一個部分引導你的應用程序

而不是這樣做(public/index.php)並引導你的整個應用程序:

$application = new Zend_Application(
    APPLICATION_ENV, 
    APPLICATION_PATH . '/configs/application.ini' 
); 
$application->bootstrap() 
      ->run(); 

你可以做到這一點,只有引導所需resouces:

$app = new Zend_Application(
    APPLICATION_ENV, 
    APPLICATION_PATH . '/configs/application.ini' 
); 

// Selectively bootstrap resources: 
$app->bootstrap('db'); 
$app->bootstrap('log'); 
$app->bootstrap('autoload'); 
$app->bootstrap('config'); 
$app->bootstrap('di'); 

你必須確保你以正確的順序初始化它們(你可能需要在你的數據庫的記錄組件,如果之前加載例如,您有一個用於日誌的數據庫寫入器)。

從那裏,你可以打電話給你引導的部分(DI組件,您可以撥打$app->getBootstrap()->getContainer()。您可以訪問您的引導可用的方法。