Zend Framework - Veritabanı Tablo Singleton

1 Cevap php

Kendimi 'cache' benim Zend_Db_Table modellerini başlatmasını yapılan çalışma benim bu kodu yapıyor bulduk:

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

Bu yöntem çok DRY olmadığını beni rahatsız ve bir tek desen muhtemelen bunu yapmak için daha iyi bir yol olacağını bugün kafama dank etti. Sorun Ben bir tek sınıf yazılı hiç, değildir. Ben bazı web aramaları yaptım, ben Zend_Db_Table tekiz, ama gerçek örnekler hakkında bazı hazırlıksız açıklamalarda bulundu.

Zaten meta-veri önbelleğe yapılandırmış.

  1. Nasıl benim Zend_Db_Table modelleri singletons yapabilirim?
  2. Tuzaklar veya olumsuz yanları var mı?

Singleton'ununu düşünme için Edit: Benim neden cevap Ben sadece benim kod aşağıdaki aramaları $x_table = new Default_Model_DbTable_X; ve var eğer tek örneği döndürülür olacağını olabileceğini düşünmüş olması oldu. Bu mümkün ise, ben bu çözümü tercih ederim.

1 Cevap

Neden sadece bazı mantıklı yerde DbTables yönetmek değil? Hiçbir mantıklı yer varsa, bir DbTableManager sınıf oluşturmak. Gibi bir şey:

<?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];  
  }
}

Lütfen bootstrap de yöneticisi başlatmak ve kayıt defterinde sopa.

Daha sonra:

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

Yani, DBTable nesneleri tembel-yük ve tekil-benzeri davranışları uygulamak.

Eğer istiyorsa, çeşitli şekillerde yukarıdaki static yapabilir.