2010-04-14 1 views
3

Я обнаружил, что делает это в моем коде в «кэш» работу, проделанной при инстанцировании моих Zend_Db_Table моделей:Zend Framework - Таблица базы данных Singleton

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); 
} 

Это беспокоит меня, что этот метод не очень DRY и сегодня мне стало ясно, что одноэлементная модель, вероятно, будет лучшим способом сделать это. Проблема в том, что я никогда не писал ни одного класса. Когда я сделал некоторые поисковые запросы в Интернете, я нашел несколько комментариев от Zend_Db_Table, но никаких реальных примеров.

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

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

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

+1

Что вы делаете в своем коде, чтобы создать экземпляр нескольких экземпляров одной и той же таблицы в одном запросе? – Gordon

+2

* (ссылка) * http://sourcemaking.com/design_patterns/singleton – Gordon

+0

Я создаю CMS, а таблицы содержат контент. Блоки контента могут быть помещены на страницу, и на странице может быть более одного блока того же типа. Спасибо за ссылку! – Sonny

ответ

3

Почему бы просто не управлять DbTables в каком-нибудь разумном месте? Если нет разумного места, создайте класс 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 объектов, и обеспечить соблюдение одноплодного типа поведения.

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

+0

Ваш метод 'Zend_Registry' выглядит хорошо, но я заинтригован тем, что вы подразумеваете под« разумным местом ». Похоже, вы подразумеваете, что 'Zend_Registry' является вторым решением. – Sonny

+0

Zend_Registry отлично подходит для такого рода вещей. Я просто имел в виду, что, в зависимости от дизайна приложения, может быть более разумное место для реализации материала dbTableManager. Но если вы не уверены, нет ничего плохого в том, чтобы просто создавать класс, как я показал, и вставлять его в реестр при загрузке базы данных. – timdev

+0

хорошо, это старый вопрос, но любопытно. Почему бы просто не сделать это подписью. Если ничего больше, это добавляет удобства.UserTable :: getInstance() -> getUsers() –