2009-10-06 4 views
6

Gibt es eine Möglichkeit, Modelle für jedes Modul zu haben? Ich habe 3 Module, eins ist ein "Kontakte" -Modul. habe ich ein Modell für die es in modules/Kontakte/models/Codes.php Codes ReglerZend Framework modulare App, kann nicht laden Modelle für jedes Modul, Autoloading Modelle?

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 Modell:

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

Der Fehler erhalte ich: Fatal Fehler: Klasse 'Contacts_Model_Codes' nicht in /Applications/MAMP/htdocs/zf_site/application/modules/contacts/controllers/CodesController.php in Zeile 26 gefunden

danke

Antwort

5

Sie müssen den Namensraum 'Contacts_' beim Auto Loader registrieren. Sie können dafür Zend_Application_Module_Autoloader verwenden.

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

Dies erstellt die folgenden Zuordnungen für Ihr Modul innerhalb des von Ihnen bereitgestellten basePath.

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

Wenn Sie Zend_Application verwenden, um Ihre Anwendung Bootstrap und es Module, die Sie nicht benötigen sollten, weil die docs sagen, dass:

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

Das ist für ZF 1.8, in dieser Version wurde das Modul Autoloader hinzugefügt nur wahr ist und Zend_Application verwendet es Module Bootstrap. In älteren Versionen müssen Sie Zend_Application_Resource_Modules verwenden – NDM

2

Ich bin mit der Version 1.9. Dies ist Teil meiner 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; 
    } 

Das Plugin Eric_Plugin_Modularlayout setzt das richtige Layout für jedes Modul.

Ich habe 3 Module: Standard, ez, Kontakte. Das lustige ist, in einer Kontaktaktion kann ich die Modelle im ez/models Verzeichnis aufrufen. ohne ein Problem.

18

Ich habe das Problem gefunden. Ich habe vergessen, eine Bootstrap-Datei in mein Kontakte-Modul einzufügen. Jetzt funktioniert alles und ich kann meine Module ihre eigenen Modelle verwenden lassen.

class Contacts_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 

} 
+5

Fügen Sie auch "resources.modules [] =" zu Ihrer application.ini hinzu –

+0

Danke, das hat mir geholfen. Ich frage mich, warum diese beiden Dinge nicht von "zf create module x" erledigt wurden. Gibt es einen Fall, in dem du sie nicht haben möchtest? – LinusR

5

hinzufügen

resources.modules[] = 

Um Ihre Konfiguration ini

6

ich die Lösung gefunden habe, denke ich! :) Es ist ein Problem, wenn Sie die nächste Ressource in der application.ini Datei hinzufügen

resources.frontController.defaultModule = "Default" 

und Sie auch eine Art von Parametern. Ich denke das ist ein Bug.

Der richtige Weg Module zu implementieren ist:

1 - Ihre gewünschten Module erstellen und den 'Standard' Modul mit zf Werkzeug

2 - apllication.ini ZF sagen, wo die Module sind und wo die Steuerungen dieser Module sind, mit

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

Verwenden

bekannt, die
resources.modules = "" 

Und gesetzt:

resources.frontController.params.prefixDefaultModule = "" 

Es ist wichtig, weil zf Werkzeug, um es auf "1". Hier ist der Fehler. :)

Und erinnern Sie sich NICHT, WAS DAS STANDARDMODUL IST !!

3 - Erstellen Sie die Bootstrap-Datei für jedes Modul und setzen:

Wenn mein Modul 'Evacol':

<?php 
class Evacol_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 
} 

speichern sie/modules/Evacol/ offensichtlich

Notieren Sie sich Evacol_ ... und ..._ Module_Bootstr ... DER NAME MEINES MODULS, DAS DIE RICHTIGE KLASSE VERLÄNGERT. Verwenden Sie nicht den Standardwert der mit dem zf-Tool erstellten Bootstrap-Datei. Ich habe es getan :)

ÄNDERN SIE NICHT ANDERES SONST. ES IST NICHT NECESARY.

Und voila! Vertrau mir. Es klappt!

Es war Zend Framework 1.10.8