Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 06-07-2010 19:50:00

Folken Laëneck
Nouveau membre
Date d'inscription: 16-03-2010
Messages: 4

Contrôleurs d'administration modulaires : quel est le meilleur moyen ?

Bonjour,

Je travaille actuellement sur un site relativement imposant, basé sur le Zend Framework et Doctrine.
Après une première période de prototyping destinée uniquement à fournir des interfaces basiques pour la saisie des contenus, je reprends peu à peu l'administration pour la rendre plus agréable à utiliser.

Pour construire rapidement l'administration sans avoir à écrire des montagnes de code, j'ai créé une classe étendant Zend_Controller_Action fournissant directement des opérations de création, d'édition et de suppression basiques. Tous les items administrables n'étant bien sur pas identiques, cette classe comprend plusieurs méthodes auxquelles sont déléguées les phases du traitement qui peuvent varier, comme l'assignation des valeurs par défaut du formulaire d'édition ou à l'inverse le report des valeurs issues du formulaire sur les modèles avant leur enregistrement. Cette classe me sert de base pour tous les contrôleur d'action de l'administration qui n'ont plus besoin de redéfinir que quelques propriétés (messages vers l'utilisateur, classes des formulaires à utiliser pour chaque action, ...) et une ou deux méthodes courtes dans les cas les plus complexes.

Le même principe est appliqué pour les vues (au nombre de deux : un listing des items et l'affichage du formulaire d'édition) qui sont partagées entre tous les contrôleurs, sauf dans les cas où il existe un besoin particulier.

Globalement, ca marche bien et j'en suis plutôt content.
Mais maintenant que je rentres peu à peu dans les détails, la situation se complique...

Alors que certains items sont directement éditables en tant que tels (ex: des contacts), d'autres sont éditables langue par langue (ex: des actualités, des produits, ...), certains doivent pouvoir être réordonnés au sein d'une liste (ex: des grades) ou dans un arbre (ex: des catégories), d'autres n'ont que quelques propriétés propres mais peuvent être associé à une grande quantité d'items plus petits qui sont administrés en même temps (ex: des vidéos et leurs annotations), et pour mettre la cerise sur le gâteau, d'autres encore combinent tout ou partie de ces comportements.

Mon but n'est bien sûr pas de gérer tous ces comportements de façon générique, il y aura bien entendu toujours des cas particulier. Mais j'aimerais poursuivre sur le concept de base dont je me suis servi jusqu'à maintenant pour les fonctionnalités les plus courantes : items traductibles éditables langues par langues, items réordonnables, ...

Mon problème est que lorsqu'un type d'item répond à plusieurs comportements à la fois, je me retrouve vite bloqué, obligé de dupliquer du code dans différentes classes pour qu'elles assument les mêmes fonctionnalités. C'est assez loin de l'idée d'origine, et c'est moche.

L'héritage multiple n'étant pas possible en PHP (et n'étant de toutes façons pas conseillé), la solution est certainement dans la composition. Une qui pourrait avoir de bons résultats serait de créer des "templates" de contrôleurs, fournissant chacun un set d'actions (ex: le template de base inclurait add / edit / delete, le template i18n inclurait editLang, ... ) et de composer les contrôleurs d'action à partir de ces briques, en redéfinissant les méthodes nécessaires pour la gestion des cas particuliers.

Mais en regardant de plus près cette solution, j'en arrive à me demander si ce ne serait pas construire quelque chose de très complexe pour au final obtenir quelque chose qui se rapproche relativement des aides d'actions. A l'inverse, il me semble difficile d'obtenir le même résultat avec des aides d'actions seules.

Ma question au final peut se résumer de la façon suivante : quel est selon vous le meilleur moyen pour construire une administration à partir d'une structure modulaire ?

Merci d'avance pour vos réflexions.

Hors ligne

 

#2 07-07-2010 08:15:51

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

Re: Contrôleurs d'administration modulaires : quel est le meilleur moyen ?

Je vais pas faire un romain comme quoi (car j'ai pas le temps smile ) mais,  t'as pensé aux helpers d'action ??


----
Gruiiik !

Hors ligne

 

#3 07-07-2010 09:11:59

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Contrôleurs d'administration modulaires : quel est le meilleur moyen ?

@nORKy t'as pas lu jusqu'au bout, il a pensé aux helpers d'actions, c'est dans l'avant dernier paragraphe smile

@Folken Laëneck : Effectivement, je pense que le mieux est de se baser sur des helpers d'action ou des plugins.

Disons qu'on part sur un plugin avec la méthode preDispatch($request).

Si tu as en tout 3 traitements possibles, tu peux faire 3 plugins correspondants aux 3 comportements possibles et au début de ton preDispatch, tu regardes si le cas correspond à ton plugin (sinon tu fais un return).

C'est un peu bourrin. En termes de perfs c'est pas forcément super (c'est pas dramatique non plus), mais c'est pour une admin, par contre tu n'as pas à mettre en place de système compliqué...

Bon j'espère :
1- que j'ai bien compris le problème
2- que si j'ai compris le problème j'ai été assez clair dans la réponse

A+, Philippe
PS : modulaire ou pas modulaire, tes plugins sont appelés par toutes les requêtes
PS2 : si le but est de traiter un formulaire et de renvoyer ailleurs, tu peux avoir intérêt à traiter ça dans un routeShutdown à la place du preDispatch...


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#4 07-07-2010 15:33:06

Folken Laëneck
Nouveau membre
Date d'inscription: 16-03-2010
Messages: 4

Re: Contrôleurs d'administration modulaires : quel est le meilleur moyen ?

Par définition, les helpers d'actions sont en effet là pour partager des fonctions récurrentes entre les contrôleurs. Là où le bas blesse et où j'ai peur de rencontrer des problèmes, c'est que les helpers sont la plupart du temps appelés via les méthodes des contrôleurs et non à leur place.
Or ce serait justement le cas ici et supposerait en effet la mise en place d'un plugin de contrôleur frontal pour créer une procédure de dispatching parallèle à celle déjà fournie par Zend, ce qui est à la fois tordu et dangereux hmm

En gros, j'ai l'impression d'avoir le choix entre des voies qui ne me plaisent pas plus l'une que l'autre :
1/ Dupliquer de grande quantité de code et faire une administration "classique"
2/ Créer un système relativement complexe de templates de contrôleur pour réutiliser un maximum de code via un jeu de composition / délégation
3/ Créer un système relativement complexe de dispatching parallèle au dispatcher standard pour appeler des aides d'actions plutôt que des actions

Autre solution : mixer la première et la dernière pour une administration construite de toute pièce à chaque fois mais réutilisant les helpers d'un contrôleur à l'autre.

A votre avis ?

Hors ligne

 

#5 09-07-2010 14:44:36

2mx
Membre
Lieu: Grenoble
Date d'inscription: 06-08-2007
Messages: 125

Re: Contrôleurs d'administration modulaires : quel est le meilleur moyen ?

Hello,

je ne vois pas trop ce qui te pose problème, j'ai un système CRUD qui fait tout ce que tu décris ci-dessus (j'en parle un peu ici http://www.z-f.fr/forum/viewtopic.php?id=1491).

Ma classe CRUD est fortement coupler à un Model générique (qui étant Zend_Db_Table).

  * Pour les items réordonnables :
J'ai une méthode Mmx_Controller_Crud::sortOder() qui fait un appel à Mmx_DB_Table::sortOder(). Le champs sur lequel se fait le classement est définit au préalable dans le model


  * items traductibles éditables langues par langues:
Là c'est directement  géré par le model en passant à true  Mmx_DB_Table::_isI18n.  La vue pour l'édition est légèrement différente avec un menu supplémentaire pour définir la langue en cours d'édition.

Maintenant je ne connais pas Doctrine...

Hors ligne

 

#6 09-07-2010 18:31:10

Folken Laëneck
Nouveau membre
Date d'inscription: 16-03-2010
Messages: 4

Re: Contrôleurs d'administration modulaires : quel est le meilleur moyen ?

2mx a écrit:

je ne vois pas trop ce qui te pose problème, j'ai un système CRUD qui fait tout ce que tu décris ci-dessus (j'en parle un peu ici http://www.z-f.fr/forum/viewtopic.php?id=1491).

Et en pratique, mon système est assez proche du tien. Le fait d'utiliser Doctrine plutôt que Zend_Db ne change pas grand chose, sinon simplifier les opérations sur la base de données.

Mais, tu as surement du rencontrer le même problème, tous les contrôleurs n'ont pas tous besoin des mêmes méthodes. Même si tous partagent quasi systématiquement les méthodes CRUD, tous les items ne sont pas réordonnables et tous non plus n'ont pas besoin de pouvoir être édité par langue. J'arrête là mes exemples, mais les lots de fonctionnalités que l'on peut vouloir généraliser de cette façon pour les appliquer à un contrôleur peuvent potentiellement devenir nombreux.

Et dans ce cas, que fais-tu ?
Si je comprends bien ce que tu écris, tous tes contrôleurs possèdent la méthode sortOrder(), même ceux qui n'en ont pas besoin. Mon but est justement d'éviter cela. D'une part parce que lorsque le nombre de fonctionnalités augmente, le nombre de lignes de code du contrôleur générique en fait autant et d'autre part parce qu'à moins de redéfinir les méthodes non utilisées dans chaque contrôleur final pour les marquer comme non utilisables, elles peuvent toujours être appelées (et là, gare à ce qui peut se passer).

Actuellement j'ai un système qui fonctionne sur trois niveaux d'héritage, proposant des items simples, des items internationalisés, et des items internationnalisés et ordonnables. Mes contrôleurs héritent de l'un ou l'autre de ces trois contrôleurs génériques. Mais quid du jour où j'aurais besoin d'un contrôleur pour un item non internationalisé mais réordonnable ?

En l'état actuel des choses, il me faudra réécrire un nouveau contrôleur générique, basé sur le plus simple des trois, mais le complétant avec les fonctionnalités du dernier. Je préférerais de très loin trouver un système qui permette de construire simplement un contrôleur pour un item donné en combinant les fonctionnalités dont il a besoin uniquement.

D'où ma question de départ (où comment le serpent se mord la queue).

Hors ligne

 

#7 12-07-2010 10:05:03

2mx
Membre
Lieu: Grenoble
Date d'inscription: 06-08-2007
Messages: 125

Re: Contrôleurs d'administration modulaires : quel est le meilleur moyen ?

oui effectivement, après avoir écrit mon message la mémoire m'est revenue, et au départ j'étais parti sur un système d'héritage avec les mêmes problèmes que tu rencontre. Le fait d'avoir toutes les fonctionnalités dans seul contrôleur générique me semble le meilleur compromis entre simplicité et pure POO.

Effectivement toutes les méthodes sont accessibles, mais si la fonctionnalité n'est pas supportée par le modèle alors on en sort direct via un "return;".


Sinon reste que PHP adopte le support des TRAITS http://www.stefan-marr.de/pages/request … e-for-php/

Hors ligne

 

#8 12-07-2010 22:09:41

omega2
Membre
Lieu: Boisbriand, quebec, canada
Date d'inscription: 01-04-2009
Messages: 85
Site web

Re: Contrôleurs d'administration modulaires : quel est le meilleur moyen ?

Salut,
Est ce que le support des TRAITS est déjà disponible en php et si oui, ça l'est depuis quelle version? Jusqu'à présent je n'ai pas entendu parler de code qui utilise cette possibilité en php.

Hors ligne

 

#9 13-07-2010 07:24:07

2mx
Membre
Lieu: Grenoble
Date d'inscription: 06-08-2007
Messages: 125

Re: Contrôleurs d'administration modulaires : quel est le meilleur moyen ?

J'en ai entendu parlé dans la mailing list du ZF et ce n'est pour l'instant qu'une proposition et un patch http://stefan-marr.de/2009/09/traits-pa … on-github/

http://devzone.zend.com/article/12014

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