我已经使用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。抱歉英语不好。这不是我的母语
答案 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”