2009-10-06 9 views
6

¿Hay alguna forma de tener modelos para cada módulo? Tengo 3 módulos, uno es un módulo de "contactos". he creado un modelo para que en los módulos/contactos/modelos/Codes.php Códigos controladorAplicación modular Zend Framework, no se pueden cargar modelos para cada módulo, modelos de carga automática?

class Contacts_CodesController extends Zend_Controller_Action 
{ 

    public function init() 
    { 
     /* Initialize action controller here */ 
    $this->view->messages = $this->_helper->flashMessenger->getMessages(); 

    } 

    public function indexAction() 
    { 

    $codesTable = new Contacts_Model_Codes(); 

    } 

Códigos Modelo:

class Contacts_Model_Codes extends Zend_Db_Table 
{ 
    protected $_name = 'codes'; 
} 

El error que consigo: Fatal error: Class 'Contacts_Model_Codes' no se encuentra en /Applications/MAMP/htdocs/zf_site/application/modules/contacts/controllers/CodesController.php en la línea 26

gracias

Respuesta

5

Debe registrar el espacio de nombres 'Contacts_' con el autocargador. Puedes usar Zend_Application_Module_Autoloader para esto.

$autoloader = new Zend_Application_Module_Autoloader(array(
     'namespace' => 'Contacts_', 
     'basePath' => dirname(__FILE__) . '/modules/cotacts', 
    )); 

Esto creará las siguientes asignaciones para su módulo dentro de la basePath que proporcione.

api/   => Api 
forms/  => Form 
models/  => Model 
    DbTable/ => Model_DbTable 
plugins/  => Plugin 

Si está utilizando Zend_Application a boostrap su solicitud y los módulos' que no es necesario porque los documentos dicen que:

When using module bootstraps with Zend_Application, an instance of Zend_Application_Module_Autoloader will be created by default for each discrete module, allowing you to autoload module resources.

+1

Esto sólo es cierto para ZF 1.8, en esta versión se añadió el cargador automático del módulo y Zend_Application lo utiliza para arrancar módulos. En versiones anteriores necesitará usar Zend_Application_Resource_Modules – NDM

2

estoy usando la versión 1.9. Esto es parte de mi rutina de carga:

protected function _initAutoload() { 
    $modelLoader = new Zend_Application_Module_Autoloader(array(
        'namespace' => '', 
        'basePath' => APPLICATION_PATH.'/modules/default') 

     ); 
} 

    protected function _initAutoloaders() 
    { 
     $this->getApplication()->setAutoloaderNamespaces(array('Eric_')); 
     return $this; 
    } 

    protected function _initPlugins() 
    { 
     $this->bootstrap('autoloaders'); 
     $this->bootstrap('frontController'); 

     // register the plugin for setting layouts per module 
     $plugin = new Eric_Plugin_Modularlayout(); 
     $this->frontController->registerPlugin($plugin); 
      return $modelLoader; 
    } 

El plug-in Eric_Plugin_Modularlayout establece el diseño correcto para cada módulo.

Tengo 3 módulos: por defecto, ez, contactos. Lo curioso es que, en una acción de contactos, puedo llamar a los modelos en el directorio ez/models. sin problema.

18

Encontré el problema. Olvidé poner un archivo bootstrap con mi módulo de contactos. Ahora todo funciona y puedo hacer que mis módulos usen sus propios modelos.

class Contacts_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 

} 
+5

También agregue "resources.modules [] =" a su application.ini –

+0

Gracias, esto me ayudó. Me pregunto por qué estas dos cosas no fueron atendidas por "zf create module x". ¿Hay algún caso en el que no los quieras? – LinusR

5

añadir

resources.modules[] = 

Para su configuración ini

6

que he encontrado la solución, supongo! :) Es un problema cuando se agrega el siguiente recurso en el archivo application.ini

resources.frontController.defaultModule = "Default" 

y también se utiliza algún tipo de parámetros. Creo que es un error.

La forma correcta para implementar módulos es:

1 - Cree sus módulos deseados y el 'defecto' Módulo con la herramienta de ZF

2 - En apllication.ini decir ZF donde los módulos son y donde los controladores de los módulos son, con

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" 
resources.frontController.moduleControllerDirectoryName = "controllers" 

Usa el conocido

resources.modules = "" 

Y establecer:

resources.frontController.params.prefixDefaultModule = "" 

Es importante porque la herramienta ZF ajustado a "1". Aquí está el error. :)

Y recuerde ¡NO PONGA LO QUE ES EL MÓDULO POR DEFECTO!

3 - Crear el archivo de inicio de cada módulo y poner:

Si mi módulo es 'Evacol':

<?php 
class Evacol_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 
} 

Guardar en/modules/Evacol/ obviamente

Tome nota de Evacol_ ... y ..._ Module_Bootstr ... EL NOMBRE DE MI MÓDULO EXTENDE LA CLASE CORRECTA. No utilice el valor predeterminado del archivo bootstrap creado con la herramienta zf. Lo hice :)

NO MODIFIQUE NINGUNA OTRA COSA. NO ES NECESARIO.

¡Y listo! Créeme. ¡Funciona!

Fue Zend Framework 1.10.8

Cuestiones relacionadas