Nasıl bir model sınıfa Zend_Application veritabanını alabilirim?

4 Cevap php

Ben modeli sınıfları bir sürü sahip bir Zend_Framework uygulaması var.

Ben bu modeli sınıfları (doğal olarak) uygulamanın veritabanına erişmek mümkün olması gerekir.

Şu anda benim index.php bu koyduk:

Zend_Registry::set('db',
        $application->bootstrap()->getBootstrap()
        ->getPluginResource('db')->getDbAdapter());

Ve sonra $db = Zend_Registry::get('db'); veritabanı gerektiren benim modeli sınıfların her birinde.

Ama bu korkunç korkunç kesmek gibi görünüyor. Burada temel bir şey eksik?

4 Cevap

Lütfen application.ini SQLite kurma örneği. Ayrıca, MySQL veya başkaları için kurulum yapabilirsiniz.

resources.db.adapter = "PDO_SQLITE"
resources.db.params.dbname = APPLICATION_PATH "/../data/db/guestbook.db"

Db uygulamasına yüklenir kez Zend_Db_Table_Abstract uzatabilir

class Application_Model_DbTable_Guestbook extends Zend_Db_Table_Abstract
{
    /** Table name */ 
    protected $_name    = 'guestbook';

    public function init() {
        $db = $this->getAdapter();

    }
}

Sen zend yöntemlerini kullanabilirsiniz ...

        $select = $db->select()
         ->from(array('p' => 'products'),
                array('product_id', 'product_name'))
         ->join(array('l' => 'line_items'),
                'p.product_id = l.product_id');

Yoksa düz sql yapabilirim ...

$sql = 'SELECT * FROM table1 t1 JOIN table2 t2 ON (t1.id = t2.id) JOIN table3 t3 ON (t3.id = t2.id);
$db->query($sql)->fetchAll(); 

Tüm bu Zend_Db_Table_Abstract uzanan bir model sınıf yapılabilir

Bir kayıt defteri girdisi içinde varsayılan DB Adaptör yapıştırma ile yanlış bir şey yok.

Her uygulama bir veritabanı kullanır beri hiçbir yerleşik "default" veritabanı bağlantı var.

Senin yöntem üzerinde (bana göre) bir iyileştirme:

Bunun yerine index.php şeyler kurma, ben genellikle adaptörü başlatılamıyor ve bootstrap.php (komut satırı proje nesil tarafından oluşturulduğu gibi) bir initdb () yöntemi kayıt defterinde sopa. Bu yolu zerdüştlerin önyükleme mekanizması tarafından idare edilebilir.

EDIT

Üzerinde __construct Zend_Registry::get('db') preform mevcut modeli uzatmak ve daha sonra $this->db saklamak Zend_Db_Table_Abstract uygulamak istemiyorum beri.

Sonra tüm modellerde sadece bu-> db $ yazmak olurdu.

Original Answer

Modeline göre Zend_Db_Table_Abstract bir örneği demek, o zaman application.ini dosyasında bu istiyorum. http://framework.zend.com/manual/en/zend.application.available-resources.html db kaynak kullanmak nasıl bir açıklama için ve diğer seçenekler bulunuyor danışın.

resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "webuser"
resources.db.params.password = "XXXXXXX"
resources.db.params.dbname = "test"
resources.db.isDefaultTableAdapter = true

Bu korkunç bir hack değil. Registry Bu durumda Hizmet Belirleme olarak hizmet vermektedir. Bu desen niyettir. Alternatif bir a Dependency Injection Container kullanmak olacaktır.

Eğer sadece model içinde Zend_Registry::get('db') yaptığını muhtemeldir beri Ancak, test etmek biraz zor kodunuzu yapar Registry sınıf, bir bağımlılık yaratıyor. Siz sadece unittests kayıt sınıfı taklit edemez. Bu modeli fabrikadan kayıt örneğini enjekte etmek daha akıllı olacaktır.

Bu ilgili soruya bakın: