我有点困惑。我用服务容器创建一个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
}
}
我怎么能以优雅的方式做到这一点?
答案 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<<');