Zend Framework模型未由自动加载器加载

时间:2010-01-21 12:21:09

标签: php zend-framework models

我已经使用Zend_Application设置了我的应用程序。我的Bootstrap.php中有一个_initAutoload()方法,如下所示:

 public function _initAutoload(){
     $this->bootstrap("frontController");
     $front = $this->frontController;

     $autoloader = Zend_Loader_Autoloader::getInstance();

     $autoloader->registerNamespace('Client_');
     $autoloader->registerNamespace('Frontend_');
     $autoloader->registerNamespace('Global_');
     $autoloader->registerNamespace('Global_Helper_');
     $autoloader->setFallbackAutoloader(true);

     $modules = $front->getControllerDirectory();
     $default = $front->getDefaultModule();

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

         $autoloader->pushAutoloader(new Zend_Application_Module_Autoloader(array(  
             "namespace" => ucwords($module),
             "basePath" => $front->getModuleDirectory($module),
         )));

     }

     return $autoloader;  
 }

我已将FrontController设置为默认模块的前缀(对我来说似乎更符合逻辑)$front->setParam("prefixDefaultModule", true)

我认为我有通常的目录结构。

问题:

我为每个模块设置了子域名。主域(www)中的所有内容都正常。主模块是前端。如果前端是默认模块,那么东西工作:)。好。现在。对于每个子域,我都有相同的index.php但是更改了 env 值。对于 client 子域,env值为 client 等。每个env值对应于我的application.xml部分。每个application.xml子域部分(客户端,api等)扩展了主要部分,称为 defaults (目前还有一个测试部分也可以启用错误等,因此每个子域扩展测试和测试扩展默认值) 。

application.xml的每个子域部分都会更改默认模块名称。因此,对于部分默认为其前端,对于部分客户端,其客户端等

立即
当我访问 domain.com/client domain.com/api 时 - 很好。 API&客户端使用Client_Model_NameOfTheModel并且喜欢它 - 它位于application / modules / client / models / NameOfTheModel.php和DbTable / NameOfTheModel.php 工作

BUT 当我从其各自的子域(client.domain.com,api.domain.com等)访问该模块并且默认模块已从前端更改为其各自的子域模块名称时 - 它结束工作。它甚至不输出“堆栈跟踪”。

  

警告:include(Client / Model / ContactLists.php)[function.include]:无法打开流:[heres-my-path-to-root] / library / Zend / Loader中没有这样的文件或目录。第136行的PHP

     

警告:include()[function.include]:无法打开'Client / Model / ContactLists.php'以包含(include_path ='[heres-my-path-to-root] / library:。:/ usr / lib / php:/ usr / local / lib / php')在[heres-my-path-to-root] /library/Zend/Loader.php第136行

     

致命错误:第4行[heres-my-path-to-root] /application/modules/client/controllers/ContactListsController.php中找不到类'Client_Model_ContactLists'

我已经尝试了2天才能让它运转起来。它只是没有。它只能在默认域下工作,并且当application.xml将其默认模块更改为其子域名时不会。像那样。这一点非常关键,因为我无法继续,这个应用程序需要在本周末之前离开沙盒(在早期测试阶段)。

感谢任何人的建议。
PS。抱歉英语不好。这不是我的母语

2 个答案:

答案 0 :(得分:3)

这只是一个粗略的猜测,但由于这些行似乎可能正在默认:

 $autoloader->setFallbackAutoloader(true);

 $modules = $front->getControllerDirectory();
 $default = $front->getDefaultModule();

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

基本上,如果您的模块是默认模块,它会跳过它,这意味着它会回退到我认为的后备自动加载器,如果默认的自动加载器无法找到您的模型,那么问题就出现了问题。错误中的根路径的concat和它尝试加载的类的路径是否正确?

此外,这看起来可能是错误的

         "namespace" => ucwords($module),

我认为它需要

         "namespace" => ucwords($module) . "_",

与其他名称空间一样。

答案 1 :(得分:1)

您使用的是哪个版本的ZF?

您使用的是后来的1.8 - 1.10版本吗?

如果是这样,您应该将Zend_Application中的资源用于模块。它为您的模块下的表单,模型,帮助程序等设置自动加载。

如果您使用的是application.ini,则每个模块都应该有这样的一行:

resources.modules.module_name =“enabled”

http://framework.zend.com/manual/en/zend.application.available-resources.html#zend.application.available-resources.modules