2009-10-06 7 views
6

モジュールごとにモデルを用意する方法はありますか?私は3つのモジュールを持っており、1つは "連絡先"モジュールです。 は、私はモジュール/連絡先/モデルにおけるそれのためのモデル/ Codes.php コードのコントローラーを作成しZend Frameworkモジュラーアプリ、モジュールごとにモデルを読み込むことができない、モデルをオートロードする?

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

    } 

コードモデル:

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

エラー私が取得:致命的な をエラー: 'Contacts_Model_Codes'クラスが/Applications/MAMP/htdocs/zf_site/application/modules/contacts/controllers/CodesController.php 26行目に見つかりません

ありがとう

答えて

5

「Contacts_」名前空間をオートローダーに登録する必要があります。 Zend_Application_Module_Autoloaderを使用してこれを行うことができます。

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

これにより、提供するベースパス内にモジュール用の次のマッピングが作成されます。

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

、あなたのアプリケーションとそのドキュメントがあると言うので、あなたがこれを必要はありません」モジュールのブートストラップをZend_Applicationを使用している場合:

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

Zend Frameworkのだった、このバージョンでは、モジュールオートローダを加え、Zend_Applicationは、モジュールをブートストラップするためにそれを使用しました。 古いバージョンでは、Zend_Application_Resource_Modulesを使用する必要があります – NDM

2

私はバージョン1.9を使用しています。 これは私のブートストラップの一部です:

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

各モジュールの正しいレイアウトを設定しますEric_Plugin_Modularlayoutプラグイン。

私は、デフォルト、ez、連絡先の3つのモジュールを持っています。 面白いのは、連絡先アクションでは、モデルをez/modelsディレクトリで呼び出すことができるということです。問題なく。

18

問題が見つかりました。私は連絡先モジュールにブートストラップファイルを入れるのを忘れていました。 これですべて動作し、モジュールで独自のモデルを使用できるようになりました。

class Contacts_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 

} 
+5

さらに、 "resources.modules [] ="をapplication.iniに追加してください –

+0

ありがとう、これが私を助けました。私はこれらの事の両方が "zf create module x"によって世話を受けなかったのはなぜだろうか。あなたがそれらを望んでいない場合がありますか? – LinusR

5

私は解決策を見つけた、私は推測する!

6

INIコンフィグに

resources.modules[] = 

を追加:) それはあなたがのapplication.iniファイルに

resources.frontController.defaultModule = "Default" 

を次のリソースを追加しても、あなたはパラメータのいくつかの種類を使用する場合に問題です。私はそれがバグだと思う。

モジュールを実装するための正しい方法は次のとおりです。

1 - ZFツール

2をご希望のモジュールと「デフォルト」モジュールの作成 - apllication.iniではどこのモジュールZFを伝えますで、どこそれらのモジュールのコントローラがあり、

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

で知ら

を使用します
resources.modules = "" 

とSET:

resources.frontController.params.prefixDefaultModule = "" 

をZFツールが "1" に設定するので、それは重要です。ここにバグがあります。 :)

そして、覚えておいてください。デフォルトのモジュールは何ですか?

3 - 各モジュールのブートストラップファイルを作成して置く:

私のモジュールは 'Evacol' の場合:それは保存

<?php 
class Evacol_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 
} 

を/モジュール/ Evacol/に明らか

メモを取るEvacol_ ... and ... _ Module_Bootstr ...正しいモジュールを拡張するモジュールの名前。 zfツールで作成したブートストラップファイルのデフォルト値を使用しないでください。私はそれをした:)

何かを変更しないでください。それは必須ではありません。

よろしくお願いします。私を信じて。できます!

が、これはZF 1.8のための唯一の真実である1.10.8

関連する問題