Zend Framework Modules无法找到/加载模型

时间:2010-03-30 04:38:58

标签: zend-framework model

出于某些令人沮丧的原因,我配置了一些模块,这似乎工作正常, 但是我无法加载模块模型。如果我将模型移动到它们加载的默认值, 但我无法让框架在本地找到它们。

示例:

我的模块目录是:

application \ modules \ books \ models \ books.php(books is my model)

class Application_Module_Books_Model_Books extends Zend_Db_Table_Abstract {}

我也试过..

Books_Model_Books,Model_Books,books,Modules_ ..你的名字我试过了:)

我的控制器位于图书模块中,并且是一个索引控制器 永远找不到本地模特。

我正在使用Application.ini并以这种方式配置:

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 1
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"

我在模块目录中有一个BootStrap:

类Admin_Bootstrap扩展了Zend_Application_Module_Bootstrap { }

我正在使用Zend Framework 1.10和想法......?

4 个答案:

答案 0 :(得分:5)

刚刚为我修复的是将以下行添加到application.ini中

<强> resources.modules [] =

然后我将Bootstrap.php添加到模块目录('application \ modules \ books \')

class Books_Bootstrap extends Zend_Application_Module_Bootstrap {

    protected function _initAutoload()
    {
      $autoloader = new Zend_Application_Module_Autoloader(array(
           'namespace' => 'Books_',
           'basePath' => dirname(__FILE__)
      ));
      return $autoloader;
     }
}    

将图书模型移至'application \ modules \ books \ models \ Books.php'

class Books_Model_Books extends Zend_Db_Table_Abstract {...}

现在您应该能够在IndexController中加载模型

$model = new Books_Model_Books();

答案 1 :(得分:2)

在application.ini中,添加一个简单的行:

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"

并在Bootstrap中的方法_initAutoload()中放置:

$front = $this->bootstrap("frontController")->frontController;
$modules = $front->getControllerDirectory();
$default = $front->getDefaultModule();

foreach (array_keys($modules) as $module) {
    if ($module === $default) {
        continue;
    }

    $moduleloader = new Zend_Application_Module_Autoloader(array(
        'namespace' => $module,
        'basePath'  => $front->getModuleDirectory($module)));
}

确保每个模块中的模型名称类似于

[name_module]_Model_[name_model]
在你的情况下,

,如

class Books_Model_Books {
}

这就是全部:D

答案 2 :(得分:0)

正确的类名是Books_Model_Books,但该类的文件名需要是Books.php(注意大写'B')。

你不应该在modules目录中有一个bootstrap,但是你可能需要为每个模块目录提供一个bootstrap,所以你需要一个类:

class Books_Bootstrap extends Zend_Application_Module_Bootstrap
{

}

at:application / modules / books / Bootstrap.php(再次注意大写'B')。

查看http://framework.zend.com/manual/en/zend.loader.autoloader-resource.html上模块资源自动加载器的部分以获取更多信息。

答案 3 :(得分:-1)

1 - 随意删除这个cuz你不再需要它了:

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

并将此代码放在您的Bootstrap.php文件[application bootstrap]而不是模块引导程序

public function _initAutoload()
{
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => '' , 
'basePath' => dirname(__FILE__) . '/modules/'));
return $autoloader;
}

回到配置你还需要添加

   resources.modules[] = ""    
   resources.frontController.defaultModule = "admin" 

这是我的完整配置文件:

phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.defaultModule = "news"
resources.frontController.prefixDefaultModule = 1
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.modules[] = ""
;resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 1
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
autoloaderNamespaces[] = "xxxxxx"

resources.db.adapter = "Mysqli"
resources.db.isdefaulttableadapter = true
resources.db.params.host = "localhost"
resources.db.params.dbname = "xxxxx"
resources.db.params.username = "root"
resources.db.params.password = "root"
resources.db.params.charset = "utf8"

希望我没有错过任何事情