Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > MVC
MVC Forum de support sur le développement d'applications de type modèle-vue-contrôleur avec Zend Framework ainsi que vos questions sur les plugins, les helpers etc. Avant de poster -> Cours MVC, FAQ ZF Controller
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/03/2007, 21h24   #1
Rédacteur
 
Avatar de Yoteco
 
Alain Sahli
Ingénieur développement logiciels
Inscription : décembre 2004
Messages : 1 086
Détails du profil
Informations personnelles :
Nom : Alain Sahli
Âge : 25

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2004
Messages : 1 086
Points : 1 479
Points : 1 479
Par défaut [0.8] MVC Modulaire

Bonjour,

Est-ce que qqun a déjà essayer de créer une architecture MVC modulaire avec le Zend Framework ?

J'ai essayer mais je n'arrive pas à aiguiller les controller sur le bon module.

D'après la doc on peut spécifier le module dans l'url, par exemple si j'ai un module 'news' je dois pouvoir taper /mon_url/news/controller/action

mais sa ne fonctionne pas

Pourtant j'ai déclare mes modules comme décrit dans la doc

voici le lien pour la doc: http://framework.zend.com/manual/fr/...r.modular.html

Merci d'avance.
Yoteco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2007, 22h47   #2
Membre éprouvé
 
Avatar de goodpz
 
Inscription : février 2007
Messages : 475
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 475
Points : 474
Points : 474
As tu déclaré les bonnes routes auprès du router ?
Il te faut quelque chose qui ressemble à ça:

Code :
1
2
3
4
5
6
7
8
$front->setControllerDirectory(array(
  'default' => '/mon_url/controllers',
  'news'    => '/mon_url/news/controllers'
));
$router = $front->getRouter();
$router->addRoute(
  'mod', new Zend_Controller_Router_Route(':module/:controller/:action/*')
);
goodpz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2007, 09h23   #3
Rédacteur
 
Avatar de Yoteco
 
Alain Sahli
Ingénieur développement logiciels
Inscription : décembre 2004
Messages : 1 086
Détails du profil
Informations personnelles :
Nom : Alain Sahli
Âge : 25

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2004
Messages : 1 086
Points : 1 479
Points : 1 479
Le setControllerDirectory je l'avais fais par contre je n'ai pas ajouté une route.

Mais je ne comprend pas comment je dois faire cet ajout de route. Est-ce que je dois mettre le chemin exact /mod/controller/action/* ou est-ce que je dois laisser comme tu as mis?

Ou est-ce que tu trouves la doc pour ces classes ? Je ne trouve rien à ce propos sur le site du Zend Framework

Merci.
Yoteco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2007, 18h56   #4
Rédacteur
 
Avatar de Yoteco
 
Alain Sahli
Ingénieur développement logiciels
Inscription : décembre 2004
Messages : 1 086
Détails du profil
Informations personnelles :
Nom : Alain Sahli
Âge : 25

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2004
Messages : 1 086
Points : 1 479
Points : 1 479
Je vais être plus clair, j'ai fais ce que tu m'as dis. Maintenant si je tape mon_url/module/controller/action

sa fonctionne mais sa n'appelle pas l'action. J'ai fais un echo avant la declaration de la classe controller et sa s'affiche donc l'inclusion doit bien se faire mais l'appelle de l'action ne fonctionne pas.

Dans mon module test j'ai créer la classe FooController et dans cette classe j'ai créer la fonction barAction mais quand je tape mon_url/test/Foo/bar sa n'appelle pas bar
Yoteco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2007, 23h16   #5
Membre éprouvé
 
Avatar de goodpz
 
Inscription : février 2007
Messages : 475
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 475
Points : 474
Points : 474
Citation:
Est-ce que je dois mettre le chemin exact /mod/controller/action/* ou est-ce que je dois laisser comme tu as mis?
Tu peux mettre ce que j'ai mis. En fait, c'est la solution minimale. Avec une telle route, le router va setter le module, le controller et l'action selon les paramètres de l'url. Cela fonctionne car le router analyse les tokens qui commencent par ':'.

En revanche, si tu précises des routes spécifiques qui ne comportent pas de variables telles que ':module' (ou :controller etc), alors il faut mettre explicitement en 2ième paramètre le module ou le controller tu utilises. Exemple:

Code :
new Zend_Controller_Router_Route('test/Foo/bar', array('module' => 'test', 'controller' => 'Foo', 'action' => 'bar'))
Sachant que le router va analyser les routes dans l'ordre inverse de leur déclaration, il est souhaitable de déclarer les routes générales en premier, c'est à dire, par exemple:

Code :
':module/:controller/:action/*'
Citation:
Ou est-ce que tu trouves la doc pour ces classes ? Je ne trouve rien à ce propos sur le site du Zend Framework
La 'end-user' doc ne donne qu'un aperçu des possibilités de chaque composants du framework. Si tu développes avec le framework, il faut aller voir la doc de l'api: http://framework.zend.com/apidoc/core/
Rien ne vaut également un petit tour directement dans les sources. Le MVC actuel est très simple (certains diront simpliste) et il est pratiquement aussi facile de browser les sources que de parcourir la doc de l'api.

En ce qui concerne ton problème d'ActionController, je te recommanderais de faire en sorte que le Front Controller lance les exceptions levée lors de la dispatch loop. Procède ainsi au début de ton code:

Code :
$front->throwExceptions(true);
Y a des chances que tu sois en mesure de voir pourquoi ça ne fonctionne pas.
Par exemple, il se peut que tu ais mal nommé le controller de ton module. Il faut qu'il soit nommé ainsi:

class Mod_IndexController extends Zend_Controller_Action

Chaque controller de module doit être préfixé du nom du module (qui est le même que le nom du répertoire du module).
goodpz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2007, 09h19   #6
Rédacteur
 
Avatar de Yoteco
 
Alain Sahli
Ingénieur développement logiciels
Inscription : décembre 2004
Messages : 1 086
Détails du profil
Informations personnelles :
Nom : Alain Sahli
Âge : 25

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2004
Messages : 1 086
Points : 1 479
Points : 1 479
Ahhhhhhhhhhhhhhhh enfin sa marche !!! Merci beaucoup!
Yoteco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2007, 16h48   #7
Invité de passage
 
Inscription : mars 2007
Messages : 3
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 3
Points : 3
Points : 3
Par défaut et les vues....

Oui pour la structure modulaire et la définition du contrôlleur.
Mais pour les vues, je ne sais pas comment m'y prendre. Je ne veux pas (du moins je souhaite) avoir à déclarer ma vue à chaque fois... Comment faire pour indiquer à Zend le path de mes vues, en fonction du module, et de l'enregistrer dans le Zend::register??

Je sais qu'une solution serait de définir, dans __constructor , mais j'aimerais le faire au premier niveau,...

Disons que j'ai le code suivant:
Code :
1
2
3
4
5
$controller->setControllerDirectory(array(
      'default'     => 'application/site/controllers',
      'cms'        => 'application/cms/controllers',
      'ecomm'        => 'application/ecomm/controllers',
));
// ICI, c'est le code normalement utilisé pour une utilisation unique... comme les vues seront séparées en fonction du module, comment faire??
Code :
1
2
3
4
5
6
 // View init
Zend::loadClass('Zend_View');
$view = new Zend_View;
$view->setScriptPath('view');
// On enregistre la vue
Zend::register('view', $view);
zudre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2007, 17h32   #8
Membre éprouvé
 
Avatar de goodpz
 
Inscription : février 2007
Messages : 475
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 475
Points : 474
Points : 474
Citation:
comme les vues seront séparées en fonction du module, comment faire??
Diverses solutions, je pense.

Tous les controllers qui appartiennent à un même module pourraient dériver d'un controller abstrait (abstract) qui se chargerait d'instancier le bon View en lui fournissant directement les scriptPathes spécifiques au module. Cette instance de View serait un membre protected et donc utilisable par tous les controllers fils. Dans ces cas là, il n'y a probablement plus besoins d'un Zend_Registry (anciennement Zend::Registry pour ZF < 0.9.0)

Une autre idée, ça serait d'utiliser un Plugin pour le preDispatch(). L'utilisation serait très proche de ce que certains font pour gérer les droits ACL. Quelques threads qui traitent de ce sujet:
http://www.developpez.net/forums/sho...d.php?t=294593
http://www.developpez.net/forums/sho...d.php?t=297319
En gros, quand la méthode preDispatch() du plugin est appelée, on connaît le nom du module sur le point d'être chargé (via l'objet Request). On a donc la possibilité d'instancier le View adéquat et de le placer dans le registry.
goodpz est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h04.


 
 
 
 
Partenaires

Hébergement Web