2011-08-25 84 views
0

我在Symfony的1.4創建的任務載荷在一些CSV文件導入表 - 很簡單 - >添加自定義的類/方法

protected function execute($arguments = array(), $options = array()) 
{ 
    $databaseManager = new sfDatabaseManager($this->configuration); 
    $connection = $databaseManager->getDatabase($options['connection'])->getConnection(); 

    ...... 

    $query = "LOAD DATA INFILE '" . $cdrfile . "' 
     INTO TABLE .... 

    etc 

    $connection->execute($query); 
} 

但我想重用的代碼別的地方本節 - 所以我創建了一個新的PHP類,並創建了一個名爲loadDataFromCSV的新靜態方法。

我把所有的代碼到該方法然後叫class::loadDataFromCSV ...

這給了我一些問題 - 首先在方法$this關鍵字不作爲類它不是一個對象有效(即不實例化) - 所以我可以實例化該類,然後調用方法class->loadDataFromCSV - 下一個問題是在第一行上的$this->configuration - 是否必須將配置傳遞給該方法才能使其工作?

什麼是最簡單的方法來創建一個簡單的方法來運行一段簡單的代碼 - 而不必傳遞大量變量。

回答

2

簡答:使用DI容器。

長答案:您基本上會問如何設置對象依賴關係,因爲您的類取決於配置對象。有兩種方法可以做到這一點。硬編碼依賴於你的課堂。例如Registry::getInstance()->get('config');並使用依賴注入。只要您可以傳遞任何配置實例,依賴注入就是更好的解決方案。現有對象,新對象,用於單元測試的模擬對象或其他配置實現。有兩種類型的依賴注入。通過構造函數注入依賴(如new Object(new Dependency()))或通過制定者。

$o = new Object(); 
$o->setDependency($dependency); 

如果你的對象有很多依賴的代碼可能成爲左右逢源的小不可讀。該解決方案是使用依賴注入容器自動注入所有依賴於你你的客戶端代碼仍然是一個簡單的行:DIContainer::create('object');創建方法創建類的實例,注入所有的依賴和返回對象

+1

我會看看依賴注入 - 謝謝。 – ManseUK

0

對於使用你的方法,你應該靜態方法:

  1. 替換自己的所有this->關鍵字::
  2. 將所有配置設置移動到一個文件中,並將它們加載到例如將實現模式Singleton的Config類中。調用看起來像Config :: getInstance() - > getSection('your_section');

關於DB初始化:

  1. 創建2種設置/獲取
  2. 創建引導文件中的DB對象的靜態方法Registry類。
  3. 使用$ connection = Registry :: get('db') - > getConnection();