Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 19-09-2009 11:09:40

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

[Zend_Db 1.9] Finalement ce sera Doctrine

Suite à de nombreuses recherches pour savoir quel design pattern (data mapper, dao, active, record, etc....) j'allais implémenter en combinaison du table gateway utilisé par zend pour accéder à la base de données, je me suis rendu compte que franchement fallait pas réinventer la roue.
Actuellement Zend_Db est trop bas niveau.
Et si un jour il veut remplir un vrai role d'ORM, il deviendra une application à part entière au même titre que Propel ou Doctrine.
Donc plutôt que de m'amuser à développer des dizaines de classes domaines, mappers, ou interfaces en tout genre, je préfère opter pour Doctrine qui me génèrera directement les objets dont j'ai besoin.

En fait, pour info, mon objectif premier, était de récupérer de la base, des objets typés plutot que des tableaux afin de débuter l'injection de dépendances.

A savoir ca:
public function titi(UserImplementation $user) {
}
à la place de ca:
public function titi($user) {
}

Dernière modification par booradley (19-09-2009 11:10:29)

Hors ligne

 

#2 19-09-2009 11:15:44

dorian53
Membre
Date d'inscription: 08-03-2009
Messages: 41

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Salut,

Peux-tu présenter en quelques mots les avantages de Doctrine par rapport à Zend_Db.
J'ai cru comprendre que tu disais qu'il générait le mapping automatiquement ?
Et sinon, pourquoi est-il mieux ?

Merci

Hors ligne

 

#3 19-09-2009 11:24:38

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Je n'ai pas dit que Doctrine était mieux que Zend_Db car ils ne proposent pas les mêmes choses.
Sans rentrer dans les détails, Doctrine, comme Propel permettent de générer directement tous les objets dont on a besoin , ce que ne fait pas Zend_Db sauf au prix d'un développement plus ou moins lourd.
En fait, si tu ne vois pas encore la différence entre Zend_Db et Doctrine, c'est sans doute que tu n'as pas besoin de Doctrine. Et à mon avis suivant la complexité du projet, Zend_Db peut très bien être suffisant.
Tu pourras trouver sur google plusieurs comparatifs sur zend_db et les orm php

Voici comment intégrer Doctrine au Zend framework:
http://www.danceric.net/2009/06/06/doct … framework/

Dernière modification par booradley (19-09-2009 11:34:41)

Hors ligne

 

#4 19-09-2009 16:46:24

dorian53
Membre
Date d'inscription: 08-03-2009
Messages: 41

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Je commence tout juste à découvrir Zend_Db, c'est le premier ORM que j'utilise.
Il est vrai qu'il manque un outil type Zend_Tool pour générer ses mappings.
Il existe bien un Zend_Generator qui le fait mais ca reste très "bricole".

En fait, je ne connais pas du tout Doctrine et Propel et justement connaitre cette différence, savoir ce qu'ils peuvent apporter de plus (à part la génération automatique).

Merci

Hors ligne

 

#5 20-09-2009 00:20:24

lesauf
Membre
Lieu: Yaoundé - Cameroun
Date d'inscription: 29-11-2007
Messages: 52
Site web

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Salut,

Le tout part de ce qu'on appelle le mapping, c'est-à-dire faire correspondre les objets du métier (ce qu'on fait) avec des tables dans la bd, bref la logique de persistance, le système de stockage. Il s'agit de libérer le controlleur de cette tache.
Ainsi on aura une classe, le mapper, qui se chargera de séparer les propriétés de ton objet qui vont dans la table A de celles qui vont dans la table B.

Par exemple, une commande à des informations générales et des lignes. Le controlleur fera juste, pour l'enregistrement

Code:

$mapper = new Mapper_Commande();
$mapper->save($commande);

Là c'est au mapper de connaitre les tables 'commande', 'produit' et 'commande-produit' qui servent à enregistrer une commande dans la bd.

Doctrine et Propel te déchargent donc d'écrire cette classe mapper, et vont même jusqu'à te générer tes classes métiers à partir de la bd. Dans l'appli tu ne réfléchira plus 'table de bd', mais 'objets métiers'.

Faut dire que c'est quand même classe, hein? Moi aussi j'ai décidé de passer à doctrine, je l'ai déjà intégré à mon CRUD. Dès que j'ai un petit temps je met en ligne.

A plus.
Lesauf

Hors ligne

 

#6 20-09-2009 17:48:46

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

The Doctrine ORM is mainly built around the Active Record, Data Mapper and Meta Data
Mapping patterns.
Through extending a specific base class named Doctrine_Record, all the child classes get
the typical ActiveRecord interface (save/delete/etc.) and it allows Doctrine to easily
participate in and monitor the lifecycles of your records. The real work, however, is mostly
forwarded to other components, like the Doctrine_Table class. This class has the typical
Data Mapper interface, createQuery(), find(id), findAll(), findBy*(),
findOneBy*() etc. So the ActiveRecord base class enables Doctrine to manage your records
and provides them with the typical ActiveRecord interface whilst the mapping footwork is
done elsewhere.
The ActiveRecord approach comes with its typical limitations. The most obvious is the
enforcement for a class to extend a specific base class in order to be persistent (a
Doctrine_Record). In general, the design of your domain model is pretty much restricted
by the design of your relational model. There is an exception though. When dealing with
inheritance structures, Doctrine provides some sophisticated mapping strategies which allow
your domain model to diverge a bit from the relational model and therefore give you a bit
more freedom.
Doctrine is in a continuous development process and we always try to add new features that
provide more freedom in the modeling of the domain. However, as long as Doctrine remains
mainly an ActiveRecord approach, there will always be a pretty large, (forced) similarity of
these two models.
After mentioning these drawbacks, it's time to mention some advantages of the ActiveRecord
approach. Apart from the (arguably slightly) simpler programming model, it turns out that the
strong similarity of the relational model and the Object Oriented (OO) domain model also has
an advantage: It makes it relatively easy to provide powerful generation tools, that can create
a basic domain model out of an existing relational schema. Further, as the domain model
can't drift far from the relational model due to the reasons above, such generation and
synchronization tools can easily be used throughout the development process. Such tools are
one of Doctrine's strengths.
We think that these limitations of the ActiveRecord approach are not that much of a problem
for the majority of web applications because the complexity of the business domains is often
moderate, but we also admit that the ActiveRecord approach is certainly not suited for
complex business logic (which is often approached using Domain-Driven Design) as it simply
puts too many restrictions and has too much influence on your domain model.
Doctrine is a great tool to drive the persistence of simple or moderately complex domain
models(1) and you may even find that it's a good choice for complex domain models if you
consider the trade-off between making your domain model more database-centric and
implementing all the mapping on your own (because at the time of this writing we are not
aware of any powerful ORM tools for PHP that are not based on an ActiveRecord approach).

Hors ligne

 

#7 21-09-2009 16:23:30

dorian53
Membre
Date d'inscription: 08-03-2009
Messages: 41

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Merci pour vos explications, vous m'avez convaincu et converti !

La génération est très appréciable en effet.
C'est en effet assez balaise, j'ai réussi à faire un save() sur un record issu d'une requête avec jointure smile

Pour être sûr d'avoir bien compris, j'ai encore quelques questions svp.
lesauf ou autre pouvez-vous me confirmer les points suivants.

1/ Sous Zend_Db on travaille Table par Table.
On est obligé de faire un findDependentRowset() et de travailler sur un nouvel objet.
Il est impossible d'exécuter un save() sur un résultat issu d'un Zend_Db_Select ?

2/ Cette notion de mapper existe t-elle sous Zend_Db (si oui comment faut-il l'implémenter) ?


Enfin à propos de Doctrine.

1/ Est-il possible d'indiquer un prefixe de class pour la génération automatique ?
Je n'ai pas trouvé, il existe pourtant un tableau d'options à passer en paramètre mais aucune info dans la doc.

Merci

Hors ligne

 

#8 21-09-2009 16:50:03

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Salut,

Dans Zend_Db tout est lazy-loaded mais le chargement automatique des dépendances n'est pas géré (l'enregistrement non plus).
Le mapping n'est pas non plus disponible (bientôt vu les proposals).

Zend_Db_Table et Zend_Db_Table_Row assurent les fonctionnalités de base d'un ORM, à savoir manipuler les tables et les enregistrements des tables d'une base de données relationnelle comme s'il s'agissait d'une base de données orientée objet.

Pour Doctrine, dans mon plugin de resource

Code:

if (true === (bool)$this->_options['generate']) {       
            $genOptions = array(
                'baseClassPrefix' => $this->_options['options']['baseClassPrefix'],
                'classPrefix' => $this->_options['options']['classPrefix'],
                'classPrefixFiles' => (bool)$this->_options['options']['classPrefixFiles'],
                'baseClassesDirectory' => $this->_options['options']['baseClassesDirectory'],
                'generateTableClasses' => (bool)$this->_options['options']['generateTableClasses']
            );
            Doctrine::generateModelsFromYaml($this->_options['path']['schema'], $this->_options['path']['models'], $genOptions);
        }

Dans la conf

Code:

;====== Resource Doctrine
resources.doctrine.dsn = "mysql://user:password@localhost/schema"
resources.doctrine.generate = false
resources.doctrine.options.baseClassPrefix = Entity_
resources.doctrine.options.classPrefix = Model_
resources.doctrine.options.classPrefixFiles = false
resources.doctrine.options.baseClassesDirectory = Entity
resources.doctrine.options.generateTableClasses = true
resources.doctrine.path.schema = APPLICATION_PATH "/config/models.yml"
resources.doctrine.path.models = APPLICATION_PATH "/models"

Par contre attention, l'option "classPrefixFiles" ne sera dispo que dans la 1.2 qui est en Alpha. Il faut donc pour l'instant renommer les fichiers à la main (les noms des classes sont ok eux).
Perso j'utilise un logiciel pour ça, genre AntRenamer, c'est un peu lourd de se le palucher.

A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#9 21-09-2009 17:08:09

dorian53
Membre
Date d'inscription: 08-03-2009
Messages: 41

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Merci beaucoup pour ant et les options, pour infos tu les as trouvé où (pas vu dans la doc ni l'api) ?

Dernière modification par dorian53 (21-09-2009 17:11:23)

Hors ligne

 

#10 22-09-2009 10:50:05

dorian53
Membre
Date d'inscription: 08-03-2009
Messages: 41

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Maintenant que je suis lancé sur Doctrine, je risque d'avoir des questions à ce sujet.
J'vais continuer sur ce topic, ceux qui l'utilise seront p'tête me répondre.

Voici quelque chose que je ne comprends pas.

Code:

$oPDO   = new PDO('mysql:host=' . Conf_Bdd::HOST . ';dbname=' . Conf_Bdd::DB, Conf_Bdd::USER, Conf_Bdd::PASS);
$oDMan = Doctrine_Manager::getInstance();
$oDMan->setCharset(Conf_Bdd::CHARSET);
$oDCon = Doctrine_Manager::connection($oPDO);
echo $oDCon->getCharset();

Si je définis le charset via le Doctrine_Manager je ne récupère pas les données de la base avec le bon encodage.
Je suis obligé de faire un $oDCon->setCharset(Conf_Bdd::CHARSET); pour que cela soit pris en compte.
Pourquoi ? Pourtant lorsque je fais un $oDCon->getCharset(); je vois bien utf8.

Merci

Hors ligne

 

#11 22-09-2009 12:35:34

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Je suppose que tu as inséré des données non encodées en utf8.

Hors ligne

 

#12 22-09-2009 12:54:50

dorian53
Membre
Date d'inscription: 08-03-2009
Messages: 41

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Non puisque ça fonctionne lorsque je précise utf8 à l'objet Doctrine_Connection.

Mais pas à Doctrine_Manager.
Or mon Doctrine_Connection devrait hériter des propriétés des Doctrine_Manager, et c'est le cas puisque $oDCon->getCharset(); me retourne bien utf8. Sauf que ça ne fonctionne pas.

Hors ligne

 

#13 22-09-2009 14:58:04

dorian53
Membre
Date d'inscription: 08-03-2009
Messages: 41

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Benjamin alias Delprog.

Je trouve que le renommage des classes est très important pour créer des packages (notamment s'il y a plusieurs bases avec les mêmes noms de tables).

Néanmoins, il y a un soucis lorsque l'on renomme des classes.
Par exemple, toi tu as choisi "Model_".

Désormais lorsque tu crées des requêtes avec Doctrine_Query tu dois faire ->from('Model_matable'), non ?
Et lorsque tu accèdes à des objet "hasOne" pareil, tu dois faire $o->Model_matable->exemple, non ?
Parce qu'il n'y a aucun alias de généré automatiquement dans les "hasOne".

De plus les commentaires @property de la baseClass ne changent pas en conséquence tu as toujours @property matable et non @property Model_matable, ce qui est gênant pour l'auto-complétion.

J'ai bien essayé de faire ça pour que Doctrine ajoute automatiquement le préfixe lors des appels getTable ou dans les query mais ça ne fonctionne pas.
$oDCon = Doctrine_Manager::connection($oPDO);
$oDCon->setOption('classPrefix', 'Model_');

Vois-tu mes problématiques.
Comment gères-tu ça ?

Merci

Dernière modification par dorian53 (22-09-2009 15:38:51)

Hors ligne

 

#14 22-09-2009 16:37:29

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Attention dans le DQL ce n'est pas la table que tu utilises dans les clauses mais l'entité.

Si j'ai un objet métier Model_User, Doctrine va aussi me créer une table Model_UserTable, mais dans mes requêtes en DQL je vais avoir:

Code:

$q = Doctrine_Query::create();
$q->from('Model_User u')
  ->leftJoin('u.profil p')    // profil = nom de la propriété dans la relation (pas de la table)
  ->where('u.id = ?', 1);  // id = nom de la propriété, pas du champ dans la table

Ce qui correspond au Yaml suivant:

Code:

---
User:
  tableName: user
  columns:
    login: string
    password: string
  actAs:
    Timestampable:
      created:
        name: created  
        type: timestamp
        format: Y-m-d H
      updated:
        name: updated
        type: timestamp
        format: Y-m-d H
  relations:
    profil:
      class: Profil
      local: id
      foreign: user_id

Profil:
  tableName: profil
  columns:
    user_id:
      name: user_id as userId
      type: integer
    name: string
    email: string
    birthDay: date
    gender: string
  relations:
    user:
      class: User
      local: user_id
      foreign: id

Dans les requêtes DQL on ne manipule que des entités, même les join se font avec le nom de la propriété qui contient les dépendances dans les entités. C'est pour ça qu'on ne précise d'ailleurs jamais la jointure avec une table de relations pour du many-to-many, c'est automatique.

Pour créer un objet (je fais pas le save dans le controlleur, mais dans l'idée c'est ça)

Code:

$user = new Model_User();
$user->login = 'login';
$user->password = md5('password');
$user->profil->name = 'Dorian';
$user->save();

$user = $this->_userService->getUserById(1);
echo $user->profil->name;

Je n'ai aucun problème avec tout ça.

Je t'invite à faire des recherches sur google pour bien intégrer et initialiser Doctrine avec ZF, notamment le blog de Matthew (http://weierophinney.net/matthew/archiv … ework.html), à bien lire la doc de Doctrine, pas en travers, comme elle n'est pas très bien faite, il faut tout lire pour trouver les infos et de poser tes questions sur le googlegroup de doctrine qui est assez réactif. Ici c'est pour ZF wink


A+ benjamin.

Dernière modification par Delprog (22-09-2009 16:41:48)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#15 22-09-2009 17:09:43

dorian53
Membre
Date d'inscription: 08-03-2009
Messages: 41

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

dorian53 a écrit:

Désormais lorsque tu crées des requêtes avec Doctrine_Query tu dois faire ->from('Model_matable'), non ?
Et lorsque tu accèdes à des objet "hasOne" pareil, tu dois faire $o->Model_matable->exemple, non ?
Parce qu'il n'y a aucun alias de généré automatiquement dans les "hasOne".

Finalement jusqu'ici on est d'accord...

Delprog a écrit:

Avec une réponse aussi simple que "Attention dans le DQL ce n'est pas la table que tu utilises dans les clauses mais l'entité.

Ce qui me gênait conceptuellement c'était de créer des requêtes sur des noms autres que ceux de mes tables : ->from('MonPackage_Orm_matable') et faire $o->MonPackage_Orm_matableEtrangere->exemple.
Mais bien que j'avais assimilé le fait qu'il fallait taper sur la class, ta réponse m'a permis d'ouvrir les yeux. Il faut que je résonne différemment, que j'oublie la base et pense entité.

Delprog a écrit:

$user = new Model_User();
$user->login = 'login';
$user->password = md5('password');
$user->profil->name = 'Dorian';
$user->save();

Ici par exemple je ne suis pas d'accord, logiquement tu fois faire un $user->Model_Profil->name = 'Dorian';
Et ca fait parti des points qui me chagrine, niveau code c'est moins fun.
Je me trompe ?

dorian53 a écrit:

De plus les commentaires @property de la baseClass ne changent pas en conséquence tu as toujours @property matable et non @property Model_matable, ce qui est gênant pour l'auto-complétion.

Tu vois , à ce niveau y'a bien un hic.
J'suis toujours dans le vrai ou j'ai zappé une étape ?

Merci pour ton aide.

Pour info, j'ai fait ce matin même une demande pour faire parti du GG GRoups.
Je peux t'assurer que je fouille dans la doc mais quand tu vois ce genre de truc
http://www.doctrine-project.org/Doctrin … _setoption
Ca frustre énormément.
J'espère que tu pourras me faire un retour à ce message.

Hors ligne

 

#16 23-09-2009 08:05:19

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

dorian53 a écrit:

Delprog a écrit:

$user = new Model_User();
$user->login = 'login';
$user->password = md5('password');
$user->profil->name = 'Dorian';
$user->save();

Ici par exemple je ne suis pas d'accord, logiquement tu fois faire un $user->Model_Profil->name = 'Dorian';
Et ca fait parti des points qui me chagrine, niveau code c'est moins fun.
Je me trompe ?

Qu'est ce qui te choque ?? Profil est un objet "de la table". Dans Doctrine, il n'y pas de prefix 'Model', et perso, j'en vois pas l'interet.
A mon avis, Delprog à "buggué" en écrivant Model_User. Soit tu préfix tous, soit tu ne le fais pas.


Autre astuce pour ne pas avoir à faire '->from('xxx')' (car j'ai vu que ca ne te plaisais pas smile )

Code:

class UserTable extends Doctrine_Table {
  public function findSpecial($id)
  {
    return 
     $this->createQuery('u')
     ->lefJoin('u.profile')
     ->leftJoin('u.Adresse a')
     ->leftJoin('a.Phonenumbers p')
     ->where('id = ?', array($id))
     ->fetchOne();      
  }
}

PS : j'utilise doctrine depuis ses premières versions


----
Gruiiik !

Hors ligne

 

#17 23-09-2009 09:08:48

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

nORKy a écrit:

A mon avis, Delprog à "buggué" en écrivant Model_User. Soit tu préfix tous, soit tu ne le fais pas.

smile

Non je n'ai pas "buggé", j'ai décidé de conserver les conventions Pear. Les noms de mes classes générées par Doctrine sont donc fonction de leur emplacement dans l'arbo. Ici dossiers models/ qui dans ZF correspondant au namespace "Model_".

Il ne faut aussi pas confondre model et propriété. En faisant:

Code:

$user = new Model_User();
$user->profil->name = 'name';

Il ne s'agit pas d'accéder au model Model_Profil mais bel est bien à la propriété "profil" qui contient un Model_Profil, ce n'est pas la même chose. Si tu regardes bien mon yaml, j'ai forcé le nom des propriétés et défini explicitement le nom de la classe correspondante pour ne pas me retrouver avec des $user->Profil mais $user->profil.

Doctrine c'est bien, mais il faut quand même bien réfléchir à séparer la logique de la persistance pour ne pas se retrouver coincé un jour.

Pour ce qui est de la génération des classes, ce n'est pas encore parfaitement au point, pas mal de choses seront corrigées avec la version 1.2 je pense.


Enfin pour mon exemple de requête, je ne fais pas comme tu proposes nORKy car je passe par des DAO. Bien que je pourrais faire:

Code:

Doctrine::getTable('Model_User')->createQuery('u');
// etc...

Mais je ne vois pas vraiment l'intérêt, le DQL est justement puissant car il permet de ne manipuler que les objets.


A+ benjamin.

Dernière modification par Delprog (23-09-2009 09:11:04)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#18 23-09-2009 09:23:08

dorian53
Membre
Date d'inscription: 08-03-2009
Messages: 41

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Delprog a écrit:

Si tu regardes bien mon yaml, j'ai forcé le nom des propriétés et défini explicitement le nom de la classe correspondante

Voila la phrase qui répond à toute cette mésentente.
Oké, merci.

Mon outils de génération Yaml ne génère pas de tableName pour les tables simples voilà pourquoi j'ai dit ça plutôt.

dorian53 a écrit:

Parce qu'il n'y a aucun alias de généré automatiquement dans les "hasOne".

Et ça répond maintenant à l'interrogation sur le préfixe, moi j'étais obligé d'appeler le modèle pour utiliser la propriété (issu du modèle).

Au final nous sommes tous d'accord.

Je suis ravi d'avoir découvert cette librairie.

Bonne journée à vous.

Hors ligne

 

#19 23-09-2009 10:58:25

dorian53
Membre
Date d'inscription: 08-03-2009
Messages: 41

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Rah je viens de perdre 1/2h parce qu'avec des minuscules ça fonctionne pas.

Code:

profil:
   tableName: profil
....

User:
   relations:
      class: profil
...

Petite précision, le Yaml tu le modifies à la main ou tu as un générateur ?
Je travaille avec MySQL Workbench et le plugin "MySQL-Workbench-Doctrine-Plugin-0.3.6" ne me génère pas le class:, je dois ajouter une majuscule et ajouter ce class partout. Sur 22 tables c'est déjà lourd.

Hors ligne

 

#20 23-09-2009 11:13:57

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Ce n'est pas comme ça qu'il faut définir une relation.

Ce code:

Code:

profil:
   tableName: profil
....

User:
   relations:
      class: profil
...

devrait être:

Code:

profil:
   tableName: profil
....

User:
  relations:
      profil:
        class: Profil
        local: id
        foreign: user_id
...

Où "profil" sera le nom de la propriété dans User et "Profil" sera la classe de référence.

Je génère le yaml depuis la base au tout départ et ensuite je maintiens à la mano parce que je redéfinis pas mal d'alias pour conserver des objets métiers détachés de la BDD (on sait jamais, si je me défais de Doctrine).

Perso, je déteste le Yaml et préfère largement le XML, plus lisible et tu peux mettre plusieurs propriétés sur une même ligne. Mais c'est comme ça, c'est le choix de Doctrine.
Sauf si Zend sort un Zend_Config_Yaml et qu'on peut passer d'un XML à un Yaml grâce à ça un jour :p


A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#21 23-09-2009 11:32:05

dorian53
Membre
Date d'inscription: 08-03-2009
Messages: 41

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Oui oui, j'ai zappé plein de chose pour l'exemple. Pas de soucis pour la définition d'une relation. Mais j'te confirme qu'en minuscule ca passe pas.

dorian53 a écrit:

Parce qu'il n'y a aucun alias de généré automatiquement dans les "hasOne".

Donc au final, retour au point de départ, j'vais faire pareil... redéfinir les alias à la mano.

Par contre j'vois pas du tout comment se défaire facilement de Doctrine.

Merci bcp

Hors ligne

 

#22 23-09-2009 11:53:20

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Par contre j'vois pas du tout comment se défaire facilement de Doctrine.

Arrête ne me lance pas sur ce sujet smile

En bref, Doctrine génère des entités qui pour lui correspondent à des tables. Je fais en sorte, grâce aux alias de lui faire construire les objets comme j'aurais construit les objets métiers sans lui (sans tenir compte de la persistance).

Ensuite dans les controlleurs je n'utilise jamais rien d'autre que ce que j'utiliserais avec des objets métiers, en gros :

Code:

$user->login;
$user->login = 'login';
$user->profil->name;
$user->profil->name = 'name';
$user->toArray();
$user->fromArray($array);

Même pas de save ou de link. De même je n'utilise jamais les tables générées par Doctrine directement. J'ai des services (consommé par mes controlleurs) qui passent par des DAO qui eux utilisent ces tables et les fonctionnalités de Doctrine à volonté.

Comme ça, si je change, je ne ré-écris rien dans mes controlleurs ni mes services, seulement mes DAO. A condition que je ré-utilise des objets métiers construits à l'identique biensûr smile


A+ benjamin.

Dernière modification par Delprog (23-09-2009 11:54:21)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#23 23-09-2009 12:41:31

dorian53
Membre
Date d'inscription: 08-03-2009
Messages: 41

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Tu refais une couche d'abstraction par dessus...
C'est à dire que ton contrôleur utilise un DAO pour piloter tes objets métiers issus de Doctrine ?
Tu n'utilises donc jamais directement de Doctrine_Query()... dans tes contrôleurs ?
Cela m'intéresse également fortement mais je suis loin de concevoir la solution à première vue.

Combien de DAO as-tu ?
Un par objet Doctrine (Doctrine_Table par exemple) ou un par objet métier ?

J'essaie d'imaginer le cas du Doctrine::getTable('...') suvi d'un find() que tu n'utilises pas.
Ou bien encore le save()...
Tu es quasiment obligé de tout surcharger ?
As-tu des exemples s'il te plait ?

Merci pour le temps que tu me consacres.

Dernière modification par dorian53 (23-09-2009 12:56:34)

Hors ligne

 

#24 23-09-2009 14:33:09

dorian53
Membre
Date d'inscription: 08-03-2009
Messages: 41

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Voici un exemple tout simple que j'ai essayé de mettre en place.
Suis-je dans l'esprit ?

Code:

class DAO_Table {

    protected $_oMetier;

    public function __construct($poMetier) {
          $this->_oMetier = Doctrine::getTable(poMetier);
    }

    public function find($pId) {
        return $this->_oMetier->find($pId);
    }

}

Le soucis c'est qu'il faut également abstraire le return du find() ?
Faire un DAO qui a l'objet Doctrine_Record en attribut ?

C'est vrai que c'est lourd comme tout DAO mais très sage.

Mais si on pousse un peu plus loin...
J'image que chaque Doctrine_Query est utilisée dans une méthode du DAO_Table ?
Que tu fais abstraction de la valeur retour du Doctrine_Query, tu as un DAO Doctrine_Collection ?

S'il faut faire comme ça, là ca devient super long.

À coté de la plaque ou en gros c'est ça ?

Hors ligne

 

#25 23-09-2009 14:39:08

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Zend_Db 1.9] Finalement ce sera Doctrine

Perso, je maintiens tout en YAML (ou en XML pour ceux qui préfère).

J'ai jamais vu des personnes autant se compliquer la vie que vous..

Sinon, je vous conseil de gardé des majuscules, c'est comme ca que fonctionne le ZF et Doctrine, pas un coup une minuscule (profil) un coup une majuscule (User)


----
Gruiiik !

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages