Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 15-04-2010 13:41:28

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

MVC Pull / MVC push: Que choisir ?

Bonjour,
Je souhaite comme tout le monde pouvoir afficher dans ma vue des blocs html issus de plusieurs modules ou de modèles différents.
Or je m'apercois qu'il y a énormément de moyens d'y parvenir.
2 points de vue s'affrontent (ou se complètent) à savoir MVC Pull et MVC Push.
Voici une explication de Wikipedia:
"Most MVC frameworks follow a push-based architecture. These frameworks use actions that do the required processing, and then "push" the data to the view layer to render the results.[3]  Struts, Django, Ruby on Rails and Spring MVC are good examples of this architecture. An alternative to this is pull-based architecture, sometimes also called "component-based". These frameworks start with the view layer, which can then "pull" results from multiple controllers as needed. In this architecture, multiple controllers can be involved with a single view. Struts2, Tapestry, JBoss Seam, Wicket and Stripes are examples of pull-based architectures."

1 - Approche MVC PUSH (le controlleur envoie les données à la vue):
1.1- le controller utilise actionStack (bien que je ne comprenne pas encore très bien le mécanisme):

Code:

$actionStack = Zend_Controller_Action_HelperBroker::getStaticHelper('actionStack');
$actionStack->actionToStack('footer','index');
...

1.2- le controlleur utilise un Action_Helper

Code:

Zend_Controller_Action_HelperBroker::addPrefix('My_Helper');
$loginForm = $this->_helper->formLoader('login');
$this->view->loginForm =  $loginForm;

Cette approche PUSH empeche la vue d'accéder au modèle (plutôt cool).

2 - Approche MVC PULL (la vue demande les données a 1 ou plusieurs controllers ou helpers de vue):
2.1 - la vue utilise un Action_View_Helper

Code:

<?php echo $this->action('gauche','login') ?>

2.2 - la vue utilise un View_Helper

Code:

$layout = Zend_Layout::getMvcInstance();
$layout->getView()->addHelperPath(APPLICATION_PATH.'/views/helpers', 'My_View_Helper');

echo $this->partial('login.phtml','candidat',array('login' => $this->myLoginViewHelper());

Cette approche PULL peut permettre à la vue d'accéder au modele, notamment dans le cas 2.2 ou le View Helper contiendrait une requete SQL via Zend_View ou Doctrine par exemple.
C'est moins nickel que l'approche PUSH mais apparemment c'est autorisé si il s'agit de simples acces en lecture (select).

Donc j'ai répertorié ces 4 façons de faire.
Mon idée première était de penser que le controlleur devait piloter la vue et non l'inverse.
Or il est vrai qu'en MVC les relations controller<=>vue peuvent se faire dans les 2 sens.

Donc les approches PUSH et PULL semblent complémentaires dans Zend.

Mais je suis tombé sur ce post par hasard:
http://www.rmauger.co.uk/2009/03/why-th … k-is-evil/

On y déconseille très très fortement d'utiliser ActionStack et les Action_View_Helpers, apparemment pour des raisons de performances et de debug car une boucle de dispatching est relancée à chaque appel.


Je souhaite avoir des avis éclairés avant de me lancer dans la refonte de mon code car ce choix est capital pour la structure d'une application.

David

Hors ligne

 

#2 15-04-2010 14:46:25

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

Re: MVC Pull / MVC push: Que choisir ?

Bonjour,

Je viens d'aller voir le code (Front.php et Dispatch/Standard.php, les méthodes dispatch() dans ces 2 classes).

Le surcoût en perf ne me parait pas énorme. Si tu n'as pas 15 plugins qui font des preDispatch inutiles, tu n'auras quasiment pas de surcoût avec un actionStack. Si tu as besoin que ton plugin ne s'exécute qu'une fois tu mets ton traitement dans le dispatchLoopStartup par exemple.

L'argument de performances ne me paraît pas très valable...

Après pour les arguments de complexité ou de design issue, ça dépend beaucoup de la façon dont tu as architecturé ton site. Je suis en train de refaire le socle technique des futurs site de ma boîte, j'utilise les action stack et j'ai plutôt l'impression que ça simplifie la vie et je ne vois pas d'incohérence majeure avec le MVC.

Par ailleurs son argument qui semble définitif sur les contrôleurs doivent rester petits et on doit tout mettre dans le modèle, ça me paraît un peu vaseux, c'est l'objet de trolls à l'infini chez les développeurs...

Bref il y a plusieurs façons de faire, mais l'article ne me paraît pas donner de raison probante pour abandonner les actionStack. A mon avis le mieux est d'essayer et de te faire une idée.

Pour moi l'avantage des actionStack est la décorrélation entre les éléments de la page (chaque action est complètement indépendante, aucune action n'en appelle une autre, elles ne savent même pas que les autres actions sont appelées).

A+, Philippe


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

Hors ligne

 

#3 15-04-2010 16:56:34

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

Re: MVC Pull / MVC push: Que choisir ?

Ok merci pour ton point de vue Philippe!
Donc tu as opté pour les actionStack cad un MVC Push.
Je suppose donc que tu utilises aussi les actionHelpers pour factoriser le code réutilisable de tes controlleurs?
Et pour les action_view_helpers, les utilises tu parfois ? Je suppose que si tu utilises les actionStack, tu n'en as jamais besoin non ?

David

Hors ligne

 

#4 15-04-2010 17:17:09

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

Re: MVC Pull / MVC push: Que choisir ?

Je suppose donc que tu utilises aussi les actionHelpers pour factoriser le code réutilisable de tes controlleurs?
=> oui

Et pour les action_view_helpers, les utilises tu parfois ? Je suppose que si tu utilises les actionStack, tu n'en as jamais besoin non ?
=> pour l'instant non... mais sur des point précis, je ne suis pas opposé au principe... (sachant que ça fait une dépendance forte entre les 2 actions, ça serait sans doute à l'intérieur d'un module, mais pas sur des actions inter-module pour ne pas introduire de dépendance entre 2 modules...)

A+, Philippe
PS : pour moi une des clés de l'architecture, c'est de réduire les dépendances. Pour ça les actionHelpers et les plugins sont très bien pensés.


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

Hors ligne

 

#5 15-04-2010 17:21:59

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

Re: MVC Pull / MVC push: Que choisir ?

Ok je te remercie beaucoup de m'avoir accordé du temps et des réponses claires.
Je vais donc commencer par tester les action stack.

A+

David

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