0

J'ai un projet que j'ai démarré sans utiliser de structure de module en ZF 1 maintenant je dois placer une structure de module pour gérer les utilisateurs (cela me semble plus logique).ZF Zend_Controller_Router_Route_Module Avec et sans un chemin par défaut du module

Mon problème de la route "par défaut" devrait essayer d'aller avec: controller /: action /: id et la route du module
devrait aller avec: module /: controller /: action /: id la valeur par défaut de ZF 1 est pour utiliser ce qui précède sans le: id
mais ma "logique" nécessite le champ: id, comment puis-je faire ce travail?

Ce que je suis venu ai essayant:

protected function _initModuleAutoload() 
{ 
    $modelLoader = new Zend_Application_Module_Autoloader(
        array('namespace' => 'DM', 
         'basePath' => APPLICATION_PATH . '/modules/default') 
        , array('namespace' => 'UM', 
       'basePath' => APPLICATION_PATH . '/modules/users') 
    ); 

    $modelLoader->addResourceType('service', 'services', 'Service'); 
    $modelLoader->addResourceType('serviceplugin', 'services/plugins', 'Service_Plugin'); 

    return $modelLoader; 
} 

public function _initFrontController() 
{ 
    $front = Zend_Controller_Front::getInstance(); 
    $router = $front->getRouter(); 

    $route1 = new Zend_Controller_Router_Route(
        ':module/:controller/:action/:id/', 
        array(
         'id' => '\d+' 
         , 'module' => 'default' 
         , 'controller' => 'index' 
         , 'action' => 'index' 
        ) 
    ); 

    $router->addRoute('default', $route1); 

    $front->addModuleDirectory(APPLICATION_PATH . "/modules/"); 

    $front 
      ->registerPlugin(new Far_Access_Plugin_Identity(), 1) 
      ->registerPlugin(new Far_Access_Plugin_Access(), 2) 
      ->throwExceptions(true) 
    ; 

    return $front; 
} 

également essayé de créer une deuxième voie pour les utilisateurs au lieu de défaut, mais ne fonctionne pas.

Des idées? Qu'est-ce que je fais mal?

Une aide de irc dans freenode a été donnée dans le canal #zftalk quand j'ai fourni ce lien.

Bittarman: crash82: ajouter des exigences à l'identifiant, donc il doit être [\ d] +
Bittarman: ou, ajoutez une instance de Zend_Controller_Router_Route_Module enchaîné à Zend_Controller_Router_Route avec juste: id dans ce , avec un ensemble par défaut pour id comme false.
Bittarman: aussi, _initModuleAutoload, est inutile Bittarman: avoir votre 'défaut' module dans les modules dir, est peu mal
Bittarman: et vous arrêter la ressource frontController de travail en ayant un _initFrontController
Bittarman: si resources.frontController ne fonctionnera plus.

crash82: hum ... Tant de problèmes :(, donc je peux placer le module « par défaut » dans le répertoire d'applications et d'autres modules peut continuer à être chargé à partir des modules/chemin

?

Bittarman: oui :)

crash82: va essayer Bittarman: et, chaque module qui a une amorce, fournit sa propre ressource du module chargeur
Bittarman: donc, si vous allez créer plus comme ça, vous finissez avec deux pour chaque module.
Bittarman: vous seriez surpris de voir combien de personnes le font.
Bittarman: s/THT/que/

+1

Le routage par défaut dans la version actuelle de ZF teste toujours le module lors du routage. L'ajout d'un module n'affectera pas le routage si vous utilisez des routes par défaut. Il suffit d'ajouter le module en tant que premier paramètre et cela devrait fonctionner. si vous voulez, consultez le code dans 'Zend_Controller_Router_Route_Module' – RockyFord

+0

Oui cela fait partie de la réponse. :-) Merci –

Répondre

0

Quand je dois passer un paramètre dans une URL dans mes scripts que j'utilise l'une des deux méthodes. Pour la plupart des choses simples, il n'y a pas vraiment besoin de créer une nouvelle route.

  1. <a href="/music/index/album/id/<?php echo $variable->id ?>"><?php echo $track->album ?></a>. Passez le paramètre en tant que/id/album_id
  2. utilisez l'assistant d'affichage url(): <?php echo $this->url(array('controller' => 'index', 'action' => 'index', 'id' => $variable->id)); ?> Cet assistant prendra également un module comme premier paramètre.Les 2 premiers travaux dans les scripts de vue, pour faire la même chose dans un contrôleur, vous pouvez utiliser l'aide d'action du réidrecteur: $this->getHelper('Redirector')->gotoSimple('action'=> 'someAction', 'controller' => 'someController', 'module' => 'someModule', array('id' => $id); avec le contrôleur, le module et les paramètres étant optionnels avec un NULL par défaut.
  3. ou vous pouvez utiliser la méthode de l'action action _forward(): $this->_forward($action, $controller, $module, array($params)) cette même syntaxe que gotoSimple() a.

Il y a d'autres façons de réaliser ce genre de routage, je vous laisse le soin de trouver le reste, mais vous pourriez commencer par Action Helpers, utility methods et view helpers

+0

oui, mais je ne veux pas spécifier l'id/1 juste le/1, je suis paresseux ... :) –

+0

d'une façon ou d'une autre votre va devoir spécifier les variables, votre choix sur la façon dont vous le faites. – RockyFord

Questions connexes