IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MVC PHP Discussion :

[0.8] MVC Modulaire


Sujet :

MVC PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Avatar de Yoteco
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    1 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 099
    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.
    Blog - Mon espace developpez -
    Oracle Certified Professional, Java SE 6 Programmer
    eZ Publish Certified developer

  2. #2
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    As tu déclaré les bonnes routes auprès du router ?
    Il te faut quelque chose qui ressemble à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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/*')
    );

  3. #3
    Rédacteur

    Avatar de Yoteco
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    1 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 099
    Par défaut
    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.
    Blog - Mon espace developpez -
    Oracle Certified Professional, Java SE 6 Programmer
    eZ Publish Certified developer

  4. #4
    Rédacteur

    Avatar de Yoteco
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    1 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 099
    Par défaut
    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
    Blog - Mon espace developpez -
    Oracle Certified Professional, Java SE 6 Programmer
    eZ Publish Certified developer

  5. #5
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    ':module/:controller/:action/*'
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $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).

  6. #6
    Rédacteur

    Avatar de Yoteco
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    1 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 099
    Par défaut
    Ahhhhhhhhhhhhhhhh enfin sa marche !!! Merci beaucoup!
    Blog - Mon espace developpez -
    Oracle Certified Professional, Java SE 6 Programmer
    eZ Publish Certified developer

  7. #7
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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);

  8. #8
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ZF 1.10] MVC architecture modulaire
    Par siriu dans le forum Zend Framework
    Réponses: 2
    Dernier message: 20/11/2011, 11h48
  2. [ZF 1.10] Problème de configuration (MVC modulaire)
    Par magmus dans le forum MVC
    Réponses: 0
    Dernier message: 20/05/2010, 22h22
  3. Réponses: 4
    Dernier message: 24/02/2009, 12h06
  4. MVC "normal" / MVC modulaire ?
    Par knocc dans le forum Langage
    Réponses: 1
    Dernier message: 17/03/2007, 00h35
  5. Classe abstraite / MVC
    Par caramel dans le forum MVC
    Réponses: 5
    Dernier message: 01/04/2003, 09h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo