2009-10-06 5 views
6

Existe-t-il un moyen d'avoir des modèles pour chaque module? J'ai 3 modules, l'un est un module "contacts". J'ai créé un modèle pour en modules/contacts/modèles/codes.php Codes contrôleurZend Framework application modulaire, ne peut pas charger les modèles pour chaque module, modèles de chargement automatique?

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

    } 

Codes Modèle:

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

L'erreur que je reçois: Fatal erreur: Classe 'Contacts_Model_Codes' introuvable dans /Applications/MAMP/htdocs/zf_site/application/modules/contacts/controllers/CodesController.php à la ligne 26

merci

Répondre

5

Vous devez enregistrer l'espace de noms 'Contacts' avec le chargeur automatique. Vous pouvez utiliser Zend_Application_Module_Autoloader pour cela. Cela créera les mappages suivants pour votre module dans le chemin de base que vous fournissez.

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

Si vous utilisez Zend_Application pour Boostrap votre application et ce module, vous ne devriez pas avoir besoin parce que les documents disent 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

Ceci est vrai que pour ZF 1.8, cette version a été ajouté le module autochargeur et Zend_Application utilise pour amorcer des modules. Dans les anciennes versions, vous devrez utiliser Zend_Application_Resource_Modules – NDM

2

J'utilise la version 1.9. Cela fait partie de mon bootstrap:

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; 
    } 

Le plugin Eric_Plugin_Modularlayout définit la mise en page correcte pour chaque module.

J'ai 3 modules: par défaut, ez, contacts. La chose amusante est, Dans une action de contacts, je peux appeler les modèles dans le répertoire ez/models. sans problème.

18

J'ai trouvé le problème. J'ai oublié de mettre un fichier bootstrap avec mon module de contacts. Maintenant tout fonctionne et mes modules peuvent utiliser leurs propres modèles.

class Contacts_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 

} 
+5

Ajoutez également "resources.modules [] =" à votre application.ini –

+0

Merci, cela m'a aidé. Je me demande pourquoi ces deux choses n'ont pas été prises en compte par "zf create module x". Y at-il un cas où vous ne les voudriez pas? – LinusR

5

ajouter

resources.modules[] = 

Pour votre config ini

6

J'ai trouvé la solution, je suppose! :) C'est un problème lorsque vous ajoutez la ressource suivante dans le fichier application.ini

resources.frontController.defaultModule = "Default" 

et que vous utilisez aussi une sorte de paramètres. Je pense que c'est un bug.

La bonne façon de mettre en œuvre des modules est:

1 - Créez vos modules souhaités et le 'par défaut' Module avec zf

2 - apllication.ini ZF dire où les modules et où sont les contrôleurs de ces modules sont, à

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

utilisation du connu

resources.modules = "" 

Et set:

resources.frontController.params.prefixDefaultModule = "" 

Il est important que zf régler sur "1". Voici le bug. :)

Et rappelez-vous NE PAS METTRE CE QUE LE MODULE PAR DÉFAUT EST !!

3 - Créez le fichier d'amorçage pour chaque module et mettre:

Si mon module est 'Evacol':

<?php 
class Evacol_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 
} 

Enregistrer dans/modules/Evacol/ évidemment

Prenez note de Evacol_ ... et ..._ Module_Bootstr ... LE NOM DE MON MODULE ÉTENDANT LA CLASSE CORRECTE. N'utilisez pas la valeur par défaut du fichier d'amorçage créé avec l'outil zf. Je l'ai fait :)

NE MODIFIEZ AUCUN AUTRE. Ce n'est pas nécessaire.

Et voilà! Croyez-moi. Ça marche!

Il était Zend Framework 1.10.8

Questions connexes