使用symfony';s依赖项注入组件与其他php类

使用symfony';s依赖项注入组件与其他php类,php,symfony1,dependency-injection,symfony-1.4,Php,Symfony1,Dependency Injection,Symfony 1.4,我有点困惑。我使用服务容器创建引导文件: require_once '/path/to/lib/sfServiceContainerAutoloader.php'; sfServiceContainerAutoloader::register(); $sc = new sfServiceContainerBuilder(); $sc->register('database', 'PDO')-> addArgument('mysql:host=localhost;dbname=

我有点困惑。我使用服务容器创建引导文件:

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
   }
}
我怎样才能优雅地完成它呢?

你可以试试:

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_注册表::get('diContainer')->getDatabase()->prepare('>>SQL