[Opened] Générer les classes métiers à partir du DAO
Posted by mik378 on 12/24/2008 01:39
Bonjour,
j'ai commencé assez récemment à apprendre les principes de base de Jelix. Or j'ai remarqué que le tutoriel pour débutant ne montre pas vraiment un exemple d'architecture en couches métiers et services.
J'ai cherché et je n'ai pas trouvé sur le forum la façon de générer automatiquement les classes métiers correspondantes aux classes DAO (comme on pouvait le faire avec Hibernate par exemple) afin de pouvoir les utiliser dans mes couches services et mes controleurs.
Faut-il créer soi-même toutes les classes métiers ??
En d'autres termes, un fichier users.dao.xml peut-il générer une classe métier User.class.php
Merci d'avance et bravo pour ce magnifique framework.
[Opened] Re: Générer les classes métiers à partir du DAO
Posted by manooweb on 12/24/2008 10:00
Salut,
oui les classes métiers tu les fais à la mimine Attention à ne pas faire des "bean" c'est à dire avec les accesseurs pour les attributs (propriétés ou membres de classe) comme en java.
En effet, j'ai eu quelques surprises avec le précompilo de jelix. Il n'accepte pas de "(" par exemple dans la valorisation des variables dans les templates. Tu mets des propriétés en public et tu y accèdes par "{maClasseMetier->maPropriete}" et non pas {maClasseMetier->getMaPropriete()}
@+ m@nu
Manu
[Opened] Re: Générer les classes métiers à partir du DAO
Posted by mik378 on 12/24/2008 11:41
J'ai bien compris ce que tu m'as dit m@noo merci.
Seulement, mes classes métiers doivent hériter d'objets Records ?? En effet, un jDao renvoi un enregistrement sous forme de Record et non d'objet simple. Comment faire correspondre les deux ?
Disons que j'ai une classe métier User.class.php, dans ma classe service j'aurai donc une fonction :
function getAllUsers(){ $fact = jDao::get('news~users'); $liste = $fact->findAll(); return $liste; }
Comment faire pour que $liste ne soit pas simplement un objet Record avec un Iterator mais bien une liste d'instance de User.class.php ??
Merci beaucoup.
[Opened] Re: Générer les classes métiers à partir du DAO
Posted by manooweb on 12/24/2008 12:14
Personnellement j'ai fait un objet avec les attributs correspondant à chaque champ de la table.
Je fais ma requête dans un contrôleur ou une classe service. je boucle sur cette requête et à chaque enregistrement j'instancie ma classe métier en lui passant l'enregistrement en paramètre.
Dans le constructeur de ma classe métier je n'ai plu qu'à affecter les champs aux attributs (qui portent le même nom que les champs) donc un simple foreach suffit.
class maClasseMetier { public $monAttibut1; // correspond au champ monAttribut1 en base ..... public $monAttributn; public function __construct($record){ // recopie de tous les champs de l'enregistrement dans les attributs du nouvel objet foreach ($record as $key => $value) { $this->$key=$value; } ..... ici tu peux faire plein d'autres trucs comme récupérer des infos par jointure }
Manu
[Opened] Re: Générer les classes métiers à partir du DAO
Posted by mik378 on 12/24/2008 12:20
Merci énormément m@noo j'y vois beaucoup plus clair maintenant :)
[Opened] Re: Générer les classes métiers à partir du DAO
Posted by mik378 on 12/24/2008 13:58
Au fait m@noo, quand tu dis "ici tu peux faire plein d'autres trucs comme récupérer des infos par jointure".
Si ma classe est User.class.php et que je décide de prendre des informations sur ces utilisateurs qui sont sur une autre table (par jointure), pourrais-tu me donner un petit exemple??
Merci d'avance.
[Opened] Re: Générer les classes métiers à partir du DAO
Posted by manooweb on 12/24/2008 15:17
Euh attention tout dépend du besoin :D Ne me fait pas dire ce que je n'ai pas dit
Pour une jointure simple (cardinalité 0~n ) un simple DAO comme écrit dans la doc avec table et clé étrangère est suffisante.
Ce que j'ai écris c'est dans le cas de jointure à cardinalité n~n où tu as donc 3 tables et donc à partir de la clé primaire de ta première table tu vas obtenir plusieurs enregistrements dans la 3ème table. Dans ce cas tu fais un 2ème DAO comme pour la jointure simple avec comme table principale la table de liens entre la 1ere et la 3ème table. Dans ta classe tu écris une méthode qui va exécuter la requête de ce DAO avec en paramètre la clé primaire de la 1ère table (que tu as récupérer dans ta classe métier) et dans ton constructeur tu mets l'alimentation d'un attribut qui va recevoir la liste résultant de la requête.
Ce que j'écris c'est pour de la lecture en base. Pour la mise à jour il te faudra le 3ème DAO pour mettre également à jour ta table de liens.
Bon comme je ne suis pas sûr d'avoir été très clair, j'étoffe l'exemple de code
class maClasseMetier { // c'est le nom du champ en base c'est à dire dans le DAO public $clePrimaireTable1; public $monAttibut1; // correspond au champ monAttribut1 en base ..... public $monAttributn; public $listeInformations; public function __construct($record){ // recopie de tous les champs de l'enregistrement dans les attributs du nouvel objet y compris la clé primaire foreach ($record as $key => $value) { $this->$key=$value; } ..... ici tu peux faire plein d'autres trucs comme récupérer des infos par jointure $this->listeInformations = $this->getInformationsFromDb } private function getInformationsFromDb() { $factory = jDao::get('monModule~mon2emeDAOAvecJointure'); return $factory->findAllByCle($this->clePrimaireTable1)->fetchAll(); }
Pour l'écriture d'une méthode de DAO avec passage de paramètre je te renvoie vers la doc Jelix qui est très claire.
http://jelix.org/articles/fr/manuel-1.1/(..)
Pour les jointures simples c'est là http://jelix.org/articles/fr/manuel-1.1/(..)
Manu
[Opened] Re: Générer les classes métiers à partir du DAO
Posted by mik378 on 12/24/2008 16:34
Mais admettons que mon besoin soit pour une cardinalité 0~n c'est-à-dire en jointure simple.
Vu que tu me précises qu'il est nécessaire de faire une méthode getInformationsFromDb() que dans le cas d'une cardinalité n~n pour récupérer les informations , je suppose donc que pour un 0~n, la variable $listeInformations serait remplie automatiquement grâce à jDao. Vrai ?
Merci beaucoup en tout cas pour ces explications.
[Opened] Re: Générer les classes métiers à partir du DAO
Posted by manooweb on 12/24/2008 18:38
Nan pas vrai dans ce cas là tu déclares les champs de la table secondaire dans le fichier dao.xml (balise <property> avec l'attribut table pour préciser cette deuxième table)
Ensuite tu n'as qu'à déclarer ces attributs dans ta classe métier comme si c'était ceux de la table principale. La première requête sur laquelle tu boucles est déjà une jointure et te ramène les champs de la table secondaire.
Manu
[Opened] Re: Générer les classes métiers à partir du DAO
Posted by mik378 on 12/24/2008 19:26
D'accord :)
Et juste une dernière remarque : précèdemment tu as écris, "Ce que j'écris c'est pour de la lecture en base. Pour la mise à jour il te faudra le 3ème DAO pour mettre également à jour ta table de liens."
Ce ne serait pas plutot : "il te faudra le 3ème DAO pour mettre également à jour la 3eme table(et non la table de liens)."
Merci encore.