3

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

 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值。对于客户端子域,env 值是client等。每个 env 值对应于我的 application.xml 部分。每个 application.xml 子域部分(客户端、api 等)都扩展了称为默认值的主要部分(当前还有一个测试部分也可以启用错误等,因此每个子域都扩展了测试和测试扩展了默认值)。

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

现在
当我访问domain.com/clientdomain.com/api - 很好。API 和客户端都使用 Client_Model_NameOfTheModel 并且像它应该的那样 - 它位于 application/modules/client/models/NameOfTheModel.php 和 DbTable/NameOfTheModel.php WORKS

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

警告:include(Client/Model/ContactLists.php) [function.include]: failed to open stream: No such file or directory in [heres-my-path-to-root]/library/Zend/Loader.php 在线136

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

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

我已经尝试了 2 天以使其正常工作。它只是没有。它只在默认域下工作,并且在 application.xml 将其默认模块更改为其子域名时不起作用。像那样。这一点目前非常非常关键,因为我无法继续,而且这个应用程序需要在本周末之前退出沙盒(早期测试版)。

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

4

2 回答 2

3

这只是一个粗略的猜测,但由于以下几行,它看起来可能在默认情况下工作:

 $autoloader->setFallbackAutoloader(true);

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

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

本质上,如果您的模块是默认模块,它会跳过它,这意味着它会退回到我假设的后备自动加载器,如果默认自动加载器找不到您的模型,那就是问题所在。错误中根路径的连接和它试图加载的类的路径是否正确?

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

         "namespace" => ucwords($module),

我认为它需要是

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

就像您的其他名称空间一样。

于 2010-01-21T23:47:38.903 回答
1

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

您使用的是更高的 1.8 - 1.10 版本吗?

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

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

resources.modules.module_name = "启用"

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

于 2010-01-22T01:20:17.250 回答