Zend Framework bir kontrolör eklenti bir önyükleme kaynak almak nasıl

3 Cevap php
protected function _initDatabase()
{
     $params = array(
            'host'     => '',
            'username' => '',
            'password' => '',
            'dbname'   => '',
        );

    $database = Zend_Db::factory('PDO_MYSQL', $params);
    $database->getConnection();
    return $database;
}

.

class App_Controller_Plugin_Test extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Http $request)
    {
        // how i get database?

    }
}

3 Cevap

Her zaman ön denetleyicisi için bir referans alabilirsiniz:

$front = Zend_Controller_Front::getInstance();

Bu sizi ön yükleme alabilirsiniz:

$bootstrap = $front->getParam("bootstrap");

Bootstrap itibaren önyükleme eklentileri alabilirsiniz:

if ($bootstrap->hasPluginResource("database")) {
      $dbResource = $bootstrap->getPluginResource("database");
}
$db = $dbResource->getDatabase();

Ama bu ekstra tesisat bir çok şey!

Dürüst olmak gerekirse, size bootstrap sırasında kayıt defterinde veritabanı bağdaştırıcısı nesnesini saklamak daha iyi olurdu:

protected function _initDatabase()
{
     $params = array(
            'host'     => '',
            'username' => '',
            'password' => '',
            'dbname'   => '',
        );

    $database = Zend_Db::factory('PDO_MYSQL', $params);
    $database->getConnection();
    Zend_Registry::set("database", $database);
    return $database;
}

Sonra her yerde veritabanı adaptör alabilirsiniz:

Zend_Registry::get("database");

What is the “right” Way to Provide a Zend Application With a Database Handler benim cevabım da bak

Çok kötü getInvokeArg("bootstrap") Zend_Controller_Action 's gibi bir şey bir eklenti var. Her zaman ön kontrolör üzerinden önyükleme başvuru alabilir:

$db = Zend_Controller_Front::getInstance()->getParam("bootstrap")->getResource("database");

Ama ne genellikle yapmak olduğunu

Zend_Registry::set('database', $database);

ve sonra eklenti:

try 
{
    $db = Zend_Registry::get('database');
}
catch (Zend_Exception $e)
{
   // do stuff
}

Daha kolay ve veritabanı hemen hemen her yerde uygulama alınabilir.

[Ben başka bir makinede çalışan bazı kod karşı kontrol etmeniz gerekir. Ben böyle bir şey olduğuna inanıyorum ...]

$db = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('db');