2009-05-17 17 views
7

¿Alguien sabe de una manera de establecer dinámicamente el módulo predeterminado en Zend Framework y no se encuentra con problemas de espacio de nombres? Por ejemplo, lo que quiero hacer es tener una tabla de módulos que se puedan cargar, con uno de ellos configurado como el módulo predeterminado. Por ejemplo, puedo tener:Módulo predeterminado dinámico en Zend Framework

admin 
blog 
calendar 

como módulos que se pueden cargar. Si tengo 'blog' como el módulo predeterminado, entonces 'admin' y 'calendar' tienen que tener sus controladores de espacio de nombres (Admin_IndexController, Calendar_IndexController) mientras que 'blog' no es (IndexController).

Si cambio el 'calendario' para que sea el módulo predeterminado, ZF ya no puede encontrar las clases debido al espacio de nombres.

¿Cómo se puede evitar eso? Actualmente estoy usando el siguiente código:

$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); 

Respuesta

6

Si planea cambiar el módulo por defecto, es probablemente el mejor espacio de nombres TODAS módulos, y luego especificar que el módulo por defecto debe ser prefijado :

primer cambio del módulo "blog" para utilizar los espacios de nombre:

<?php 

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

} 

Luego, llame setParam para opción prefixDefaultModule en la instancia de Zend_Controller_Front:

<?php 

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

Ver bug # 1831 una explicación.

1

Puede hacer que un módulo predeterminado sea realmente la parte decisiva en todo este proceso. Más específicamente: haga que todas las solicitudes de módulo predeterminado vayan a una clase que luego decidirá qué módulo específico es el predeterminado en ese momento y lo redirigirá a la solicitud.

Al menos esa es la forma en que hemos implementado ella;)

0

Suena como el trabajo de un plugin de controlador preDispatch.

Puede modificar la solicitud para cambiar un módulo en función de cierta solicitud o identidad/sesión/datos conocidos para reenviar o redirigir a petición.

4

uso application.ini: resources.frontController.prefixDefaultModule = true resources.frontController.defaultModule = por defecto