【问题标题】:Zend Framework Modules can't find/load ModelsZend 框架模块无法找到/加载模型
【发布时间】:2010-03-30 04:38:58
【问题描述】:

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

例子:

我的模块目录是:

application\modules\books\models\books.php(books 是我的模型)

class Application_Module_Books_Model_Books extends Zend_Db_Table_Abstract {}

我也试过了..

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

我的控制器在 Books 模块中,是一个索引控制器,它 永远找不到本地模型。

我正在使用 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,还有想法..?

【问题讨论】:

    标签: zend-framework model


    【解决方案1】:

    刚刚为我解决的问题是将以下行添加到 application.ini

    resources.modules[]=

    然后我在模块目录('application\modules\books\')中添加了一个 Bootstrap.php

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

    【讨论】:

      【解决方案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

      【讨论】:

        【解决方案3】:

        正确的类名应该是 Books_Model_Books,但该类的文件名必须是 Books.php(注意大写的“B”)。

        你不应该在模块目录中有一个引导程序,但你可能确实希望每个模块目录都有一个引导程序,所以你需要一个类:

        class Books_Bootstrap extends Zend_Application_Module_Bootstrap
        {
        
        }
        

        在:application/modules/books/Bootstrap.php(再次注意大写“B”)。

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

        【讨论】:

        • 原来问题是我的模块名称没有以大写“M”开头..哎呀..
        【解决方案4】:

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

        resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
        

        并将此代码放入您的 Bootstrap.php 文件 [application bootstrap] 而不是模块 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"
        

        希望我没有错过任何东西

        【讨论】:

          猜你喜欢
          • 2013-12-26
          • 1970-01-01
          • 1970-01-01
          • 2014-08-28
          • 1970-01-01
          • 2012-02-28
          • 1970-01-01
          • 1970-01-01
          • 2011-03-25
          相关资源
          最近更新 更多