使用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