将symfony的Dependency Injection组件与其他php类一起使用

时间:2011-11-29 17:02:48

标签: php symfony1 dependency-injection symfony-1.4

我有点困惑。我用服务容器创建一个bootstrap文件:

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
   }
}

我怎么能以优雅的方式做到这一点?

1 个答案:

答案 0 :(得分: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 $ adapter)。好吧无论如何,你明白了。或者您可以像这样使用它:

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<<');