Zend Framework模块化应用程序,无法为每个模块加载模型,自动加载模型?

时间:2009-10-06 03:54:36

标签: zend-framework model module

有没有办法让每个模块都有模型?我有3个模块,一个是“联系人”模块。 我在modules / contacts / models / Codes.php中为它创建了一个模型 代码控制器

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

我得到的错误: 致命错误:第26行的/Applications/MAMP/htdocs/zf_site/application/modules/contacts/controllers/CodesController.php中找不到类'Contacts_Model_Codes'

感谢

5 个答案:

答案 0 :(得分:18)

我发现了问题。我忘了在我的联系人模块中放入一个bootstrap文件。 现在一切正常,我可以让我的模块使用他们自己的模型。

class Contacts_Bootstrap extends Zend_Application_Module_Bootstrap
{

}

答案 1 :(得分:6)

我猜我找到了解决方案! :) 在application.ini文件中添加下一个资源时会出现问题

resources.frontController.defaultModule = "Default"

并且您也使用某种参数。我认为这是一个Bug。

实施模块的正确方法是:

1 - 使用zf工具创建所需的模块和“默认”模块

2 - 在 apllication.ini 中告诉ZF模块在哪里以及这些模块的控制器在哪里,

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

使用已知的

resources.modules = ""

并设置:

resources.frontController.params.prefixDefaultModule = ""

这很重要因为zf工具将其设置为“1”。这是错误。 :)

请记住,不要把默认模块放在哪里!!

3 - 为每个模块创建bootstrap文件并放入:

如果我的模块是'Evacol':

<?php
class Evacol_Bootstrap extends Zend_Application_Module_Bootstrap
{
}

显然将它保存到/ modules / Evacol /

注意 Evacol _ ...和..._ Module_Bootstr ...我的模块名称扩展正确的类别。 不要使用zf工具创建的bootstrap文件的默认值。我做到了:)

不要修改任何人。这不是必要的。

瞧!相信我。它有效!

这是Zend Framework 1.10.8

答案 2 :(得分:5)

您必须使用自动加载程序注册“Contacts_”命名空间。您可以使用Zend_Application_Module_Autoloader进行此操作。

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

这将为您提供的basePath中的模块创建以下映射。

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

如果您正在使用Zend_Application来提升您的应用程序及其模块,那么您不应该这样做,因为文档说:

  

将模块引导与Zend_Application一起使用时,默认情况下会为每个离散模块创建Zend_Application_Module_Autoloader的实例,允许您自动加载模块资源。

答案 3 :(得分:5)

添加

resources.modules[] =

到你的配置ini

答案 4 :(得分: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为每个模块设置正确的布局。

我有3个模块:默认,ez,联系人。 有趣的是,在一个联系人动作中我可以调用ez / models目录中的模型。没问题。