Répertoire de codes source

Générateur de classes ORM [MAJ le 26/01/2010]
déposé par Echo
le 14/04/2008
nombre de visites : 7662

edité le 26/01/2010
par Echo

Description

Au sein du Framework Zend, vous avez besoin de définir une classe dans le répertoire 'models' qui étend Zend_Db_table_Abstract pour chaque table de votre base de données que vous voulez accéder. Pour chacune de ces classes, vous avez besoin de déclarer des variables protected comme le nom de la table dans $_name, les clé(s) primaire(s) dans $_primary, les tables dépendantes dans $_dependentTables, les tables liées dans $_referenceMap, etc. Au final, vous passez un temps fou à créer les mêmes choses et, à chaque modification de votre base de données, vous devez encore éditer vos modèles!
Zend_Generator_Orm est un composant simple qui lit l'architecture de votre base de données et génères automatiquement les modèles Zend. Ce générateur de classes fonctionne que ce soit en création ou en update tout en conservant les méthodes implémentées par l'utilisateur.

Contraintes et règles de nommage 

N'ayant pas la possibilité de savoir par programmation avec un describeTable si le champs est une foreign key, JE VOUS DECONSEILLE ABSOLUMENT DE RENOMMER VOS FOREIGN KEY. Par ailleurs, JE VOUS ENCOURAGE FORTEMENT A RESPECTER UNE REGLE DE NOMMAGE telle que celle décrite ci-dessous. Ces règles me semblent élémentaires dans le développement de bases de données car de cette manière la lecture devient plus aisée (on identifie d'un seul coup d'oeil les foreign key et leur table de provenance) et chaque champs est unique :

  • noms des tables au singulier, en lettres uniquement (par exemple "article") ;
  • noms des champs préfixés par le nom de la table suivi d'un underscore (par exemple "article_id") ;
  • une clé étrangère conserve son nom de clé primaire (par exemple "article_id" s'appellera toujours "article_id" dans une table de commande "order" de clé primaire "order_id") ; 

Restrictions 

Je l'ai entièrement recodé entre 2 trajets de métro... A l'arrache quoi! Ca fonctionne sur mes BDD, ça corrige pas mal de merdes qui existaient par contre ça ne marche toujours que pour MySQL. Je promets de faire la portabilité pour Oracle et Postgres!

Concernant le code d'exemple ci-dessous

L'instantiation peut se faire de 3 manières :

  1. $orm = new Zend_Orm() : la macro "APPLICATION_MODELS" (à définir dans le bootstrap "index.php") est alors utilisée pour définir le chemin vers votre répertoire "models"
  2. $orm = new Zend_Orm("/path/to/models/directory")
  3. $orm = new Zend_Orm(); $orm->setModelsPath("/path/to/models/directory").
La génération des classes se fait automatiquement à l'appel de l'URL http://yourhost/webapp_dir/admin/database
 

[Edit]

Ce code source a été proposé à contribution au Zend Framework. Le code source et son évolution sont désormais consultables à l'adresse suivante : http://framework.zend.com/wiki/display/ZFPROP/Zend_Generator_Orm+-+Thomas+VEQUAUD

Vous pouvez récupérer le code source sur mon site Web à l'adresse suivante : http://thomas.vequaud.free.fr/download/Zend_Generator_Orm.zip

Il suffit d'extraire les fichiers du zip directement dans le répertoire de librairie Zend et d'appeler Zend_Orm comme n'importe quel composant Zend (cf. code d'exemple ci-dessous).

[/Edit] 

<?php
 
require_once('controllers/CommonController.php');
 
/**
 * AdminController
 * 
 * Permet de gérer ... :
 * index	=> ...
 * 
 * @author	Thomas VEQUAUD <thomas.vequaud@gmail.com>
 * @uses	Zend_Controller_Action
 */
class AdminController extends Zend_Controller_Action
{
    /**
     * indexAction
     * 
     * @return	void
     */
    public function		indexAction()
    {
    	return;
    }
 
 
    /**
     * databaseAction
     * Database administration
     * 
     * @return	void
     */
    public function		databaseAction()
    {
    	// ORM
    	$orm = new Zend_Orm();
	$orm->create();
	$orm->update();
	$this->view->files	= $orm->getFiles();
	$this->view->errors	= $orm->getErrors();
	unset($orm);
 
        return;
    }
 
}
 
Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages