Utilisation d'un ActiveRecord avec le ZendFramework
Une des autres choses sympa du ZendFramework c'est les actives record ... le principe est assez simple on doit pouvoir utiliser notre table de logs en faisant simplement :
class Logs extends Zend_Db_Table {}
Et hop a nous les update, inserts, delete et autres joyeusetées !
Pour s'en servir il faut le configurer une bonne fois pour toutes :
##### # Active record setup ### Zend::loadClass('Zend_Db_Table'); Zend_Db_Table::setDefaultAdapter(Zend::registry('db')); function loadTable($tableName) { require_once('./_/application/models/' . $tableName . '.php'); }
on met notre classe Logs dans un fichier nommé logs.php dans ./_/application/models/logs.php et il suffit ensuite n'importe ou dans le code de faire :
loadTable('logs');
puis de s'en servir comme ceci :
$log = new Logs(); $log->insert(array( 'level' => 'MONLEVEL', 'message' => 'Hop un test' ));
Et la on se rend compte qu'il y a des gars qui codent pour le ZendFramework et qui utilisent des vieilles références php4, que j'ai immédiatement supprimé afin de faire fonctionner ça !
Bon ensuite cette histoire de array ça me plait pas du tout ... j'ai eu l'occasion de tester RoR et c'est plus sympa de faire :
$log = new Logs(); $log->level = 'MONLEVEL'; $log->message = 'Hop un test'; $log->insert();
Mais pour ça il faut modifier leur classe Zend_Db_Table afin que la fonction insert soit celle-ci :
public function insert($data = null) { if ($data == null) { $data = array(); foreach ($this->_cols as $col) { if (!empty($this->{$col})) { $data[$col] = $this->{$col}; } } } $this->_db->insert( $this->_name, $data ); return $this->_db->lastInsertId(); }
Je vais modifier le active record et leur envoyer pour qu'ils se dirigent plutot vers cette solution qui a mon avis est bien plus intuitive ! Mais le principe est le même si vous voulez utiliser ceci pour le update et le delete !
Il y a tout un tas d'options sympa mais je vous laisse a la doc sur le ZendFramework qui en parlera mieux que moi je l'espère ;)
PS: je vais essayer de faire évoluer le ActiveRecord pour qu'il prenne aussi les tables a plusieurs identifiant et si j'ai vraiment la motivation, pour qu'il permette les link entre les tables de type 1/1 ou 0/n ! Il faut que ça boost leur truc la ;)

Comments
Pour ne pas avoir à hacker Zend_Db_Table, il est possible de l'étendre afin d'adapter les méthodes insert() et update() comme c'est expliqué dans la doc.
C'est juste ! J'avais mes tests directement sur leur classes, et c'est pas trop mon habitude mais il est préférable d'étendre plutot que modifier !
Rien que pour une question de nouvelles version qui écrase tout =)
Zend à un peu évoluer depuis ce post (notamment dans le nommage de certain classe) mais le principe reste le même.
Le must du must serait de pouvoir faire ça
$log = new Logs();
$log->id = 122;
echo $log->message;
En gros un active "Reading" avec la meme classe, suffit de tester si la _pk est définit dans l'objet $log pour savoir si elle doit ou non retourner des valeurs.