Zend_Db_Table Использование разных Connection-Adapter для чтения и записи

В текущем проекте ZF мне приходится использовать разные подключения к БД для чтения и записи. Мой подход заключался в том, чтобы сделать это, расширив Zend_Db_Table_Abstract (и Zend_Db_Table_Row_Abstract)

На данный момент это выглядит так:

class SomeNamespace_Db_Table extends Zend_Db_Table_Abstract {
/**
 * @var Zend_Db
 */ 
protected $read = NULL;

/**
 * @var Zend_Db
 */ 
protected $write = NULL;

/**
 * Constructor.
 *
 * Supported params for $config are:
 * - db              = user-supplied instance of database connector,
 *                     or key name of registry instance.
 * - name            = table name.
 * - primary         = string or array of primary key(s).
 * - rowClass        = row class name.
 * - rowsetClass     = rowset class name.
 * - referenceMap    = array structure to declare relationship
 *                     to parent tables.
 * - dependentTables = array of child tables.
 * - metadataCache   = cache for information from adapter describeTable().
 *
 * @param  mixed $config Array of user-specified config options, or just the Db Adapter.
 * @return void
 */ 
public function __construct($config=array()){       
    $this->read  = Zend_Registry::get('read');
    $this->write = Zend_Registry::get('write');

    $config['db'] = $this->read;              
    return parent::__construct($config);
}

/**
 * Inserts a new row.
 *
 * @param  array  $data  Column-value pairs.
 * @return mixed         The primary key of the row inserted.
 */    
public function insert(array $data){
    $this->setAdapter($this->write);
    $result = parent::insert($data);
    $this->setAdapter($this->read);

    return $result;
}

/**
 * Updates existing rows.
 *
 * @param  array        $data  Column-value pairs.
 * @param  array|string $where An SQL WHERE clause, or an array of SQL WHERE clauses.
 * @return int          The number of rows updated.
 */    
public function update(array $data, $where){
    $this->setAdapter($this->write);
    $result = parent::update($data,$where);
    $this->setAdapter($this->read);

    return $result;
}

/**
 * Fetches a new blank row (not from the database).
 *
 * @param  array $data OPTIONAL data to populate in the new row.
 * @param  string $defaultSource OPTIONAL flag to force default values into new row
 * @return Zend_Db_Table_Row_Abstract
 */    
public function createRow(array $data = array(), $defaultSource = NULL){
    $this->setAdapter($this->write);
    $result = parent::createRow($data, $defaultSource);
    $this->setAdapter($this->read);

    return $result;
}

/**
 * Deletes existing rows.
 *
 * @param  array|string $where SQL WHERE clause(s).
 * @return int          The number of rows deleted.
 */    
public function delete($where){
    $this->setAdapter($this->write);
    $result = parent::delete($where);
    $this->setAdapter($this->read);    

    return $result;
}

/**
 * Allow to set current used connection
 * from Enalog_Db_Table_Row
 * 
 * @param Zend_Db $db
 */    
public function setAdapter($db){
    $this->_db = self::_setupAdapter($db);
    return $this;
} 

}

На мой взгляд, это путь к большому количеству избыточного кода. (В Zend_Db_Table_Row мне также придется перезаписать методы сохранения и setFromArray)

Любые предложения по этому поводу? Переключение между двумя подключениями к БД должно быть максимально прозрачным.

ТИА Руфинус


person Rufinus    schedule 14.12.2009    source источник
comment
Я задал аналогичный вопрос здесь: stackoverflow.com/questions/1826798/   -  person Pro777    schedule 14.12.2009


Ответы (3)


Ваш код выглядит довольно хорошо. Ваш подкласс в любом случае должен перехватывать каждый применимый метод, и я не вижу, как могут появиться ошибки. Большой вопрос: помогает ли код?

person Derek Illchuk    schedule 14.12.2009
comment
я обновил свой пост до работающего кода. пока с ним вообще проблем нет. - person Rufinus; 14.01.2010

Есть еще один способ сделать это, показанный здесь

person Shane O'Grady    schedule 14.12.2009

Я нашел эту статью http://www.amazium.com/blog/using-other-databases-with-zend-framework, который поможет вам использовать различные адаптеры подключения в Zend_Db_Table.

person eistrati    schedule 23.06.2011
comment
укажите контекст для ссылок. Обобщите соответствующие моменты прямо в своем ответе; добавьте ссылку для получения дополнительной информации. - person Gilles 'SO- stop being evil'; 23.06.2011