Zend Framework - таблица базы данных Singleton - PullRequest
3 голосов
/ 15 апреля 2010

Я обнаружил, что делаю это в своем коде, чтобы «кэшировать» работу, выполненную при создании экземпляров моих Zend_Db_Table моделей:

if (Zend_Registry::isRegistered('x_table')) {
    $x_table = Zend_Registry::get('x_table');
} else {
    $x_table = new Default_Model_DbTable_X;
    Zend_Registry::set('x_table', $x_table);
}

Меня беспокоило, что этот метод не очень СУХОЙ, и меня осенило, что одноэлементный паттерн, вероятно, будет лучшим способом сделать это. Проблема в том, что я никогда не писал синглтон-класс. Когда я проводил некоторые поиски в Интернете, я нашел несколько нецензурных комментариев о Zend_Db_Table синглетонах, но реальных примеров не было.

У меня уже настроено кэширование метаданных.

  1. Как мне сделать мои Zend_Db_Table модели синглетонов?
  2. Есть ли подводные камни или недостатки?

Редактировать: Моя причина, по которой я подумал об одном-единственном ответе, заключалась в том, что я подумал, что в моем коде могут быть просто следующие вызовы $x_table = new Default_Model_DbTable_X;, и единственный экземпляр будет возвращен, если он существует. Если это возможно, я бы предпочел это решение.

1 Ответ

3 голосов
/ 15 апреля 2010

Почему бы просто не управлять таблицами DbTable в каком-то разумном месте? Если разумного места нет, создайте класс DbTableManager. Что-то вроде:

<?PHP
class DbTableMgr {

  protected $_tables;

  public function getTable($classname){
    if ( empty($this->_tables[$name]) ){
      //assuming some things about class names for the sake of brevity elsewhere...
      $classname = 'Default_Model_DbTable_',ucfirst(strtolower($classname));

      $this->_tables[$name] = new $classname; 
    }
    return $this->_tables[$name];  
  }
}

Инициализируйте менеджер в своем загрузчике и вставьте его в реестр.

Тогда:

<?PHP
//in a galaxy far, far, away
$dbtFoo = Zend_Registry::get('dbtMgr')->getTable('Foo');

Итак, вы лениво загружаете объекты dbTable и применяете одноэлементное поведение.

Вы можете сделать это статическим различными способами, если хотите.

...