2009-05-17 10 views
7

Est-ce que quelqu'un connaît un moyen de définir dynamiquement le module par défaut dans Zend Framework et de ne pas rencontrer les problèmes d'espace de noms? Par exemple, ce que je veux faire est d'avoir une table de modules qui sont autorisés à être chargés, avec l'un d'entre eux défini comme le module par défaut. Par exemple, je peux avoir:Module dynamique par défaut dans Zend Framework

admin 
blog 
calendar 

comme des modules qui peuvent être chargés. Si j'ai 'blog' comme module par défaut, alors 'admin' et 'calendar' doivent avoir leurs noms de contrôleurs contrôlés (Admin_IndexController, Calendar_IndexController) alors que 'blog' n'est pas (IndexController).

Si je change de 'calendrier' pour être le module par défaut, ZF ne peut plus trouver les classes à cause de l'espace de noms.

Comment vous débrouillez-vous? J'utilise actuellement le code suivant:

$modules = new Modules(); 
$activeModules = $modules->fetchActive(); 
foreach($activeModules as $mod) { 
    $loadedModules[$mod->name] = '..application/modules/' . $mod->name . '/controllers'; 
    if($mod->default) { 
     $defaultModule = $mod->name; 
    } 
} 
$frontController->setControllerDirectory($loadedModules); 
$frontController->setDefaultModule($defaultModule); 

Répondre

6

Si vous envisagez de changer le module par défaut, il est probablement préférable de l'espace de noms TOUS modules, puis spécifiez que le module par défaut doit être préfixé :

d'abord changer le module "blog" pour utiliser l'espace de nommage:

<?php 

// Used to be "class IndexController" 
class Blog_IndexController extends Zend_Controller_Action { 

} 

Ensuite, appelez setParam pour options prefixDefaultModule sur votre instance de Zend_Controller_Front:

<?php 

    // Allow your default module to be prefixed 
    $frontController->setParam('prefixDefaultModule', true); 

Voir bug # 1831 pour une explication.

1

Vous pouvez faire qu'un module par défaut soit réellement la partie décisive dans tout ce processus. Plus précisément - faites passer toutes les demandes de module par défaut à une classe qui décidera quel module spécifique est actuellement le module par défaut et le redirigera vers cette dernière.

Au moins, c'est la façon dont nous avons implémenté;)

0

Cela ressemble au travail d'un plugin de contrôleur preDispatch.

Vous pouvez modifier la demande pour modifier un module en fonction d'une demande ou d'une identité/session/données connues à transmettre ou à rediriger à la demande.

4

utilisation application.ini: resources.frontController.prefixDefaultModule = true resources.frontController.defaultModule = default