Newsgroup: it.comp.www.php
Titolo: Zend framework: controllare se una tabella esiste nel DB

Salve,
la domanda e` un po' specifica, ma spero ci sia qualcuno che conosce zend
framework che puo` aiutarmi.
Sto facendo un sito con questo framework. Solitamente, quando faccio tutto
io, nel costruttore della classe che gestisce la tabella del database
metto un controllo di esistenza della tabella stessa nel DB. Se la tabella
esiste, tutto bene, se non esiste, richiama un metodo della classe che la
crea.
Questo mi torna molto utile soprattutto durante lo sviluppo: se cambia lo
schema della tabella mi basta cancellarla e lui se la ricrea da solo.
Stessa cosa al deploy: al primo accesso ogni tabella viene creata
just-in-time, assieme ad eventuali indici e dati di base.
Con lo Zend Framework non so dove mettere questo controllo in modo da
essere coerente e pulito col resto del framework.
Qualche suggerimento?
Grazie.
Bye.

 essere coerente e pulito col resto del framework.
Riporto come ho risolto, per ora, perche` magari serve a qualcuno.
Sono perplesso sulla "liceita`" della cosa, perche` non e` documentata da
nessuna parte, e ho semplicemente letto i sorgenti delle classi e trovato
un punto che mi sembrava buono (_setupMetadata).
Purtroppo il costruttore della classe e` abbastanza monolitico, e richiama
diverse funzioni in sequenza, tra cui quella, senza poter piazzare plugin
in mezzo, quindi l'unico modo mi e` sembrato sovraccaricare quella piu`
adatta (la gestione dei metadati, appunto).
In pratica derivo la classe Zend_Db_Table_Abstract cosi`:
class My_Db_Table_Abstract extends Zend_Db_Table_Abstract
{
  public function _setupMetadata()
  {
    if ( ! $this->check_table()) {
      if (method_exists($this, "create_table")) {
        $this->create_table();
      }
    }
    parent::_setupMetadata();
  }
  protected function check_table()
  {
    $db = $this->getAdapter();
    try {
      $st = $db->query("describe ". $this->_name);
      $st->fetchAll();
    } catch (Exception $e) {
      return false;
    }
    return true;
  }
}
Dopodiche`, tutte le classi che gestiscono tabelle derivano questa classe:
class UserTable extends My_Db_Table_Abstract
{
  protected $_name = "user";
  protected $_rowClass = "User";
  protected $_primary = "uid";
  protected $_sequence = true;	// has auto-increment key
  protected $_dependentTables = array("Content", "Comment");
 
  protected function create_table()
  {
    $db = $this->getAdapter();
    $st = $db->query("
      create table user (
        uid           int primary key auto_increment,
        ...
      )
    ");
  }
}
Natualmente questo toglie l'astrazione dal DB, e funziona solocon MySQL,
ma per quello che mi serve ora va bene, in caso in futuro si potra`
personalizzare per renderla database-independant. :)
Bye.

 un punto che mi sembrava buono (_setupMetadata).
Sono un po' pirla, e Ludovico Caldara (che ringrazio pubblicamente) mi ha
indicato correttamente in email che il sistema e` documentato qui:
vedi 9.5.2.3. Overriding Table Setup Methods:
http://framework.zend.com/manual/en/zend.db.table.html
Quindi e` il metodo corretto di procedere.
Purtroppo ho letto la sua email dopo aver gia` fatto tutto il lavoro.
Devo leggere meglio i manuali. :)
Bye.