Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je suis tombé sur un point de design qui me gène un peu dans le framework concernant Zend_Db_Table_Abstract et Zend_Db_Table_Rowset_Abstract. En effet, il y a du code redondant pour instancier une Zend_Db_Table_Row_Abstract dans Table::fetchRow et Rowset::current.
La ou ça me gène, c'est que c'est le rowset qui prend la responsabilité de créér une ligne et de lui affecter sa table. Du coup, si je veux avoir une rowClass différente en fonction des data de la ligne courante, il faut que je modifie (dérive donc) des deux classes.
Il y a une fonction pour instancier une row sans donnée provenant de la base, Table::CreateRow mais pas pour des données venant de la base. Or à mon sens, celà aurait été tout aussi bien, et le Rowset aurait tout simplement alors délégué cette tache à sa table.
Ce que j'ai fait.
J'ai rajouté une fonction à ma classe Table
public function createDbRow(array $data) { @Zend_Loader::loadClass($this->_rowClass); return new $this->_rowClass($data); }
J'ai modifié le fetchRow pour qu'une fois le tableau $data initialisé, il y ait un appel à cette méthode
public function fetchRow($where = null, $order = null) { // code not shown.... $data = array( 'table' => $this, 'data' => $rows[0], 'readOnly' => $select->isReadOnly(), 'stored' => true ); return $this->createDbRow($data); }
J'ai modifié le current() du rowset dans le meme sens
public function current() { if ($this->valid() === false) { return null; } // do we already have a row object for this position? if (empty($this->_rows[$this->_pointer])) { $this->_rows[$this->_pointer] = $this->_table->createDbRow( array( 'table' => $this->_table, 'data' => $this->_data[$this->_pointer], 'stored' => $this->_stored, 'readOnly' => $this->_readOnly ) ); } // return the row object return $this->_rows[$this->_pointer]; }
Pourquoi tout ça, c'est simple, maintenant, je peux surcharger createDbRow et modifier la valeur de rowClass sur ma table en fonction de $data['data']. Ainsi en fonction, d'une valeur de colonne, je pourrais avoir une définition de classe appropriée.
public function createDbRow(array $data) { $this->_rowClass = $data['data']['classname']; return parent::createDbRow(array $data); }
Votre avis ?
Hors ligne