Zend Framework uygulama katmanında Master / Slave anahtarı

4 Cevap php

Ben uygulama katmanı içinde gerçekleşmesi için Master / Slave anahtarı gerektiren bir uygulama yazıyorum. Şu anda olduğu gibi, ben eşleyiciye oluşturulması üzerinde bir Zend_Db_Table nesnesi ve daha sonra köle setDefaultAdapter.

Şimdi baz mapper classe içinde, ben aşağıdaki yöntemi var:

public function useWriteAdapter()
{
    if(Zend_Db_Table_Abstract::getDefaultAdapter() != $this->_writeDb)
    {
        Zend_Db_Table_Abstract::setDefaultAdapter($this->_writeDb);
        $this->_tableGateway = new Zend_Db_Table($this->_tableName);
    }
}

Ben bu konuda bir sağlamlık denetimi gerekir. Ben sadece daha iyi bir yolu olmalı sanıyorum, yükü çok fazla olduğunu sanmıyorum.

4 Cevap

Türünde bir nesne Zend_Db_Table_Row_Abstract Tablo nesne onu üreten hatırlar. Eğer save() aramadan önce Ama ilişkili Tablo değiştirebilirsiniz.

$readDb = Zend_Db::factory(...);  // slave
$writeDb = Zend_Db::factory(...); // master
Zend_Db_Table::setDefaultAdapter($readDb);

$myReadTable = new MyTable(); // use default adapter
$myWriteTable = new MyTable($writeDb);

$row = $myTable->find(1234)->current();

$row->column1 = 'value';

$row->setTable($myWriteTable);

$row->save();

Nasıl başlangıç ​​gerçekleştiren genişletmek temel bir sınıf gibi bir şey hakkında?

class My_Db_Table extends Zend_Db_Table
{
    function init() 
    {
        if (....) {
           // set the default adaptor to the write-DB-master
        }
        parent::init();
    }
}
// all your models then extend My_Db_Table instead of Zend_Db_Table

Ben sorunuza cevap olacağını düşünüyorum this article hangi bulduk :)

Although you most probably already came up with a solution I will still post the way I did it: I was looking for a solution for the same problem and came up with the idea to put the logic for that into the Adapter.

Ben Zend_Db_Adapter_Abstract genişletilmiş ve $ yazıyor boolean niteliği eklenmiştir. Ben de bunun için kamu alıcı ve ayarlayıcı yöntemleri ekledi.

(Yazma için) master için bir ve (okuma) köle için bir: Benim adaptörü iki farklı database-configurations/-connections kaydeder. (Aslında bir yapılandırma değil ama birçok yüzden ağırlığına göre rastgele seçilen usta ve üniteden tür bir havuzu var.)

Şimdi şu: Ben bir sorgu $ yazıyor ayarlanmış olmalıdır çalıştırmadan önce doğru veya yanlış. Yönteminde () adaptör $ yazıyor değerine bağlı olarak doğru bağlantıyı bağlayan veya kullanır bağlayın.