Utilisation d'un ActiveRecord avec le ZendFramework

Tagged:

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.