Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 28-01-2010 12:19:54

slaughter
Membre
Date d'inscription: 01-04-2008
Messages: 217

ZF + Doctrine : Encore une reflexion sur le model

Bonjour à tous,

Cela fait plusieurs fois que je réfléchis sur la meilleure façon d'implémenter la couche Mode du ZF. Après lecture des nombreux topics à ce sujet sur z-f, j'ai fini par prendre Doctrine pour sa souplesse et son automatisation.

Je me retrouve maintenant avec une classe par table dans ma base avec le relation qui vont bien etc. Et ensuite des classes métiers (je pense) qui hérite des classes de persistance avec la possibilité de créer les méthodes nécessaires, findById($id), findByName($name), etc.

Avant de me lancer vraiment et de me rendre compte que je pars une nouvelle fois dans une mauvaise direction (au moins 3 fois depuis mes débuts sur ZF), je ne serais pas contre votre vision et avis sur la meilleure façon de continuer cette couche model ?

Au final, je pense utiliser pas mal d'interfaces pour pouvoir utiliser mes différents objets métiers de la même façon.
Exemple : sur Facebook, le membre peut uploader une photo, poster un commentaire, utiliser une application, le tout se retrouve listé sur sa page d'accueil. Je voudrais pouvoir faire la même chose sur mon site avec la création d'une news, d'un article, d'un topic, etc.

Même si je ne sais pas comment je vais m'y prendre pour l'instant, je pense qu'il y aura une beaucoup de lien entre mes différents objets métiers.

Ma question est un peu vague mais quelle est la structure la plus souple pour avoir ce genre d'architecture ?
Utilisation d'interface sur les objets "métiers" générés par doctrine (puisqu'il ne peut pas y avoir d'héritage multiple) ?
Utilisation d'objet complétement différents et ceux-ci contiennent les objets doctrine (cela permet d'avoir un autre héritage) ?
Complétement autre chose

Merci d'avance.

Hors ligne

 

#2 28-01-2010 14:02:58

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

Re: ZF + Doctrine : Encore une reflexion sur le model

Salut,

Je vais encore passer pour le gros lourd de l'architecture mais tant pis smile

C'est une question à laquelle il est difficile de répondre exactement. Il y a beaucoup de paramètres qui entrent en jeu.

Venant du monde objet, depuis que je suis sur PHP je planche sans arrêt sur la question. Il y a beaucoup de concepts qui chacun prône son excellence, et dans PHP il y a tout à faire (et c'est aussi pour ça que c'est passionnant).

Certains te diront que d'un point de vue vitesse de dev et maintenance c'est mieux d'avoir un modèle métier anemic (en gros des sacs à setters et getters) et de foutre toute la logique métier dans des services (métier, parce qu'en plus il y a des services dans différentes couches, en gros je parle du pattern Service Layer qui facilite la distribution d'une API).

D'autres te diront : "le DDD (Domain Driven Design) c'est le top du top, rendons le métier aux objets métier !" (entre autres parce que le DDD ce n'est pas que ça).

Au départ, je voulais être un "puriste" et je me suis orienté vers un modèle métier riche. Malheureusement, avec les ORM PHP actuels c'est pas tout à fait possible (si tu respectes les conseils du DDD par ex.).
Si on prend Doctrine 1.2, il faudra forcément à un moment transgresser des règles de modélisation métier pour arriver à tes fins, à moins de mapper encore par dessus Doctrine. Avec la version 2, ce problème ne devrait plus exister.
Le problème est que tes objets métiers sont générés par ton ORM et sont le reflet exacte de ta base de données, or, c'est une aberration car on ne devrait jamais construire son modèle métier en fonction de la persistance. Et en réalité, les données que tu vas afficher à un utilisateur sont souvent le mélange de plusieurs états de plusieurs objets métiers. Si tu utilises directement tes objets métiers dans ta vue, tu devras parfois (si la relation n'existe pas dans ta BDD) effectuer autant de requêtes que d'objets différents pour lesquels t'as besoin d'afficher un état.

Bien sûr tout dépend de la dimension de l'appli. Pour une petite application, a faible scalabilité, l'utilisation de Doctrine est un vrai bonheur, pas besoin de plus de couches, du MVC, eventuellement une façade, mais tu consommes directement toutes les fonctionnalités de Doctrine. Et là, le dév est très très rapide.

Maintenant si tu comptes développer une appli distribuée, à forte scalabilité, c'est une toute autre histoire. Mais c'est possible, sans partir trop dans des délires qui pourrissent les performances smile

L'exemple de Facebook tombe bien. En ce moment je suis sur un projet de site communautaire qui devra proposer éventuellement (en fonction de son succès) une API distribuée (consommable par webservices). Du coup, pas question de faire du traitement dans le front (controlleurs/vues).

Le modèle est très très simple, très peu de traitements métier. Mais par contre, les objets sont très riches en données et il existe beaucoup de relations entre eux. J'ai mis en place des services (via le pattern Service Layer) qui doivent assurer la validation et le filtrages des données, le contrôle des ACLs, etc etc.
Au départ je ne voulais pas, mais pour limiter le nombre de requêtes, pour envoyer des objets les plus riches possible en un seul échange, j'ai du mettre en place un pattern supplémentaire, le Data Transfer Object, accompagné du pattern Assembler.

En gros, mon front ne manipule que des DTOs, pas les objets métiers, mes services attendent des DTOs, transforment ces objets via des assembleurs en objets métiers, effectuent les traitements métiers et renvoient des DTOs. Mais tout dépend de ta couche métier, parfois les objets Doctrine peuvent suffir et un toArray() fera l'affaire et pas besoin de DTOs. Mes vues utilisent les DTOs qui possèdent exactement les données dont j'ai besoin (autre avantage ils sont totalement détachés de la persistance). Les avantages sont de pouvoir modéliser les DTOs comme on veut, en fonction des besoins, d'échanger un max d'info en un seul échange, de ne pas être influencé par un changement dans la persistance et/ou dans le modèle métier (il faudra juste adapter les assembleurs). Le gros gros inconvénient est le nombre d'objets supplémentaires que ça représente et la quantité de code qu'il faut pousser en plus, et ça ça peut vraiment refroidir.

Je ne sais pas comment faire pour rester simple, tout dépend vraiment de ce que tu veux faire smile
Parce que certains vont se dire : "houla, des DTOs et puis quoi encore, il part vraiment dans un délire celui là !".

Pour répondre plus directement à ta question. Pour moi, pour une appli. importante, voilà comment j'ai obtenu de la souplesse dans mon architecture :

métier :
    - entités
    - interfaces de repository pour les objets métiers

api :
    - interfaces des services
    - implémentations des services
    - validateurs (des Zend_Form améliorés qui servent de validateurs)
    - assembleurs Objets Métiers / DTOs
    - acls

data
    - implémentations des repository (persistance, DAO)
    - DTOs

front
    - controlleurs
    - vues

Et biensûr de l'injection de dépendance (IOC) obligatoire (et c'est un gros manque de zend actuellement) pour les tests unitaires et la maintenance de l'appli.

Le plus complexe a été d'apporter la validation dans les services tout en étant capable de retourner les erreurs de validation (plutôt qu'une pauvre Exception). Zend ne permet pas ça, car les formulaires sont prévus pour être dans le front.

Pour ça j'ai implémenté le pattern Notification proposé par Martin Fowler sur mes DTOs.

Tous ces choix pour une application. Pour une autre ça pourrait être bien différent !

Tout ça est très passionnant quand tu t'y intéresses, et quand j'en suis à faire du front et me rendre compte que tout roule, c'est le pied smile

Sur ce, j'espère ne pas être parti trop dans le détail.


A+ benjamin.


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

Hors ligne

 

#3 28-01-2010 14:04:26

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

Re: ZF + Doctrine : Encore une reflexion sur le model

Utilise les "injections de dépendances" et si t'es patient, patiente pour la sortie de Doctrine 2 qui te permettra d'être comme tu dis "plus souple"


----
Gruiiik !

Hors ligne

 

#4 28-01-2010 15:13:52

3uclide
Membre
Date d'inscription: 09-08-2008
Messages: 194

Re: ZF + Doctrine : Encore une reflexion sur le model

Et côté performance ça donne quoi toutes ces couches?

Hors ligne

 

#5 29-01-2010 09:25:54

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

Re: ZF + Doctrine : Encore une reflexion sur le model

Salut,

Niveau performances c'est plutôt satisfaisant. En fait si c'est bien foutu ça ne pourrit pas tant les performances que ça.
Sachant que les DTOs sont des objets ne possédant que des états et des accesseurs (aucun traitement). Ils ne sont donc pas beaucoup plus lourds qu'un array ou qu'un stdClass.

Un service est aussi léger, une liste de cas d'utilisations. Tous les objets passent par défaut par référence en PHP. Par ex. le controlleur crée un DTO et le passe au service, qui lui le nourrit.

Les Forms sont de toute façon utilisés dans une appli standard ZF, et mes validateurs sont des versions plus légères des Zend_Form.

En fait, quand on voit le nombre de classes qui sont nécessaires rien que pour le framework, tout ce que nous rajoutons est bien dérisoire. Le tout est de ne pas faire n'importe quoi avec l'injection de dépendances, de ne pas tout injecter systématiquement mais en fonction du controlleur qui est sollicité.

Il faut aussi faire gaffe à certains objet, Zend_Date par ex., l'utilisation du cache aussi, qui mal employé peut avoir un impact négatif sur les performances. Bien utilisé par contre il fait gagner pas mal de perf.


A+ benjamin.


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

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