1

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);

}
2
  • 1
    The answer depends on the contents of your bootstrap and config. Zend_Db_Table::getDefaultAdapter() might work depending on your setup. Commented Oct 22, 2015 at 20:06
  • @rjdown, that worked great. The accepted answer also worked so it's good to know there are two approaches. Commented Oct 23, 2015 at 12:34

1 Answer 1

1

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.

Sign up to request clarification or add additional context in comments.

3 Comments

David, I added to my OP so as to clarify for any future user. Thank you for a concise answer. Your post caused me to look at Bootstrap.php and I discovered that the commentor on my post who suggested using $this->db = Zend_Db_Table::getDefaultAdapter() also was correct.
@Oliver Williams: Of course, in the current situation, you could access the application object - from anywhere - from global scope via $_GLOBALS['application']. But this is undesirable in many ways. Hit me in chat if you want to talk further.
And, you note, once created, you could stash the adapter in the Zend_Registry instance, thereby making it accessible anywhere, which is very convenient. But there is an insidious downside: every static/global reference an app has increases the component linkages, making debugging and unit-testing harder.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.