2011-11-29 64 views
3

我有點困惑。我創建服務容器引導文件:在其他php類中使用symfony的依賴注入組件

require_once '/path/to/lib/sfServiceContainerAutoloader.php'; 
sfServiceContainerAutoloader::register(); 

$sc = new sfServiceContainerBuilder(); 

$sc->register('database', 'PDO')-> 
    addArgument('mysql:host=localhost;dbname=my_dbname')-> 
    addArgument('user')-> 
    addArgument('password')-> 
    addArgument(array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')); 

我現在想創建一個類,並使用該數據庫

class Foo { 
    functon runSomeQuery() { 
    // Here I want to use database 
    } 
} 

我怎麼會做一個優雅的方式?

回答

0

你可以嘗試:

class Foo { 

    /** 
    * @var PDO 
    */ 
    private $_adapter = null; 

    public function __construct(PDO $adapter = null) { 
     if (!$adapter) { 
      // assuming you have your generated DI container set there 
      $this->_adapter = Zend_Registry::get('diContainer')->getDatabase(); 
     } else { 
      $this->_adapter = $adapter; 
     } 
    } 
} 

你也可以做到這一點在其他類似的方式,比如落實setAdapter(PDO $適配器)。無論如何,你明白了。或者你可以像這樣使用它:

public function __construct() { 
    // assuming you have your generated DI container set there 
    $this->_adapter = Zend_Registry::get('diContainer')->getDatabase(); 
} 

有很多方法可以做到這一點很好,取決於你如何真正想要的一切。 基本相當不錯的選擇:
1.通過構造函數+在構造函數注入(如果不是作爲構造器PARAM提供)
2.通過DI容器只
3.注射用單獨的方法注射在構造器
4.取決於什麼你在做/想做的事情,可能只是通過DI容器註冊服務,並使用它,不要將它保存在課堂上。 (例如:
Zend_Registry :: get('diContainer') - > getDatabase() - > prepare('>> SQL < <');