从Zend Framework 1中的应用程序对象获取数据库适配器

时间:2015-10-22 18:51:09

标签: php zend-framework pdo zend-db

我正在研究用Zend Framework编写的应用程序。我想创建一个独立的API。我正在复制public/index.php,这是关键代码:

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini');
$application->bootstrap()->run();

我已经删除了run()指令,现在我正在尝试编写数据库查询..我试过了:

$application->_connection; //not declared, fails
$application->_db; //same deal
$application->select(); //same deal

我想要运行:

$result = $application->_some_connection_object_but_where->query( .. );

你能帮助我回答“但在哪里”部分吗?感谢

- 编辑信息 -

另外,为了回答我对此的重大回应,我确实有一个名为/application/Bootstrap.php的文件,其中包含一个名为:

的类
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap

和这种连接方法:

protected function _initDb()
{
    $appConfig = new Zend_Config_Ini('../application/configs/application.ini', APPLICATION_ENV);
    Zend_Registry::set('appConfig',$appConfig);

    $dbConfig = new Zend_Config_Ini('../application/configs/db.ini', APPLICATION_ENV);
    Zend_Registry::set('dbConfig',$dbConfig);
    $db = new Zend_Db_Adapter_Pdo_Mysql(array(
        'host' => $dbConfig->database->params->host,
        'username' => $dbConfig->database->params->username,
        'password' => $dbConfig->database->params->password,
        'dbname' => $dbConfig->database->params->dbname,
   ));
    $db->setFetchMode(Zend_Db::FETCH_ASSOC);
    $db->getConnection(); // force a connection... do not wait for 'lazy' connection binding later
    Zend_Registry::set('db',$db);

    Zend_Db_Table::setDefaultAdapter($db);

}

1 个答案:

答案 0 :(得分:1)

如果你已经在"标准"中引导你的资源?使用表单./application/config/application.ini文件中的引用的方式:

resources.db.adapter = mysql
resources.db.params.host = localhost
// etc

然后你应该能够使用:

Zend_Application对象获取适配器对象
$adapter = $application->getBootstrap()->getResource('db');

然后,您可以针对该适配器编写数据库查询。

[或 - 甚至更好 - 将该适配器提供给一个模型,该模型将特定的db-queries封装/隐藏在一个定义良好的接口中,该接口的实现将更加可测试。]

<强>更新

根据请求,这是将db-adapter注入模型的示例。

class Application_Model_BaseModel
{
    protected $db;

    public function __construct($db)
    {
        $this->db = $db;
    }

}

class Application_Model_Users extends Application_Model_BaseModel
{
    public function getVerifiedUsers()
    {
        $select = $this->db->select()
            ->from('users')
            ->where(array(
                'verified' => true,
            ));
        return $this->db->fetchAll($select);
    }    
}

然后用法:

$model = new Application_Model_Users($db);
$users = $model->getVerifiedUsers();

使用Zend_Db_Table_Abstract作为基本模型可能会进一步加强这一点,但我有意提供了一个简单的例子来说明我将数据库适配器注入模型的意思。