Reputation: 6334
I am working on an application written in Zend Framework. I want to create a stand-alone API. I'm copying over from public/index.php
, and here is the key code on that:
/** 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();
I have copied that over minus the run()
directive, and now I'm trying to write db queries.. I've tried:
$application->_connection; //not declared, fails
$application->_db; //same deal
$application->select(); //same deal
I want to run things like:
$result = $application->_some_connection_object_but_where->query( .. );
Can you help me answer the "but where" part? Thanks
--EDITED INFO--
Also, to answer the great response I had on this, I do have a file called /application/Bootstrap.php
with a class called:
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
and this method for connection:
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);
}
Upvotes: 1
Views: 2608
Reputation: 14184
If you have bootstrapped your resources in the "standard" way using references in your ./application/config/application.ini
file of the form:
resources.db.adapter = mysql
resources.db.params.host = localhost
// etc
then you should be able to get the adapter object from the Zend_Application
object using:
$adapter = $application->getBootstrap()->getResource('db');
Then you can write your db queries against that adapter.
[Or - even better - feed that adapter into a model that encapsulates/hides the specific db-queries inside a well-defined interface whose implementations will be more testable.]
Update
Per request, here is an example of injecting a db-adapter into a model.
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);
}
}
Usage would then be:
$model = new Application_Model_Users($db);
$users = $model->getVerifiedUsers();
This could be probably tightened further by using Zend_Db_Table_Abstract
as the base model, but I intentionally provided a bare-bones example to show what I mean about injecting a db adapter into a model.
Upvotes: 1