使用Symfony的依赖注入组件与其他PHP类配合使用

3

我有点困惑。我使用服务容器创建了一个 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

你可以尝试:

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. 通过构造函数注入 + 在构造函数中(在没有提供构造函数参数的情况下)
2. 仅通过 DI 容器在构造函数中注入
3. 使用单独的方法注入
4. 取决于你正在做/想要做什么,可能只需通过 DI 容器获取注册服务并直接使用它,而不将其保存在类中。(例如:
Zend_Registry::get('diContainer')->getDatabase()->prepare('>>SQL<<');


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接