Я пишу приложение, которое требует, чтобы переключатель Master / Slave выполнялся внутри прикладного уровня. Как сейчас, я создаю объект Zend_Db_Table при создании mapper, а затем setDefaultAdapter для подчиненного устройства.
Теперь внутри базового класса mapper, у меня есть следующий метод:
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); } }
Мне нужна проверка здравомыслия. Я не думаю, что накладные расходы слишком велики, я просто подозреваю, что должен быть лучший способ.
Объект типа Zend_Db_Table_Row_Abstract
запоминает, какой объект таблицы его создал. Но вы можете изменить соответствующую таблицу перед вызовом save()
.
$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();
Как насчет чего-то вроде базового класса, который вы расширяете, который запускает запуск?
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
Я нашел эту статью, которая, я думаю, ответит на ваш вопрос 🙂
Хотя вы, скорее всего, уже придумали решение, я все равно опубликую способ, которым я это сделал: я искал решение для той же проблемы и придумал идею поместить его в адаптер.
Я расширил Zend_Db_Adapter_Abstract и добавил логический атрибут $ write. Я также добавил для него общедоступные методы getter и setter.
Мой адаптер сохраняет две различные конфигурации базы данных / -соединения: один для ведущего (для записи) и один для ведомого (для чтения). (На самом деле это не одна конфигурация, но многие, поэтому у меня есть пул мастеров и мазей, которые выбираются случайным образом по весу.)
Теперь я делаю следующее: перед выполнением запроса $ write должно быть установлено true или false. В методе connect () адаптер подключается или использует правильное соединение в зависимости от значения $ write.