我已经用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值已更改.对于客户端子域,env值为客户端等.每个env值对应于我的application.xml部分.每个application.xml子域部分(客户端,api等)扩展了称为默认值的主部分(当前有一个测试部分也启用了错误等功能,因此每个子域都扩展了测试,并且测试扩展了默认值).
application.xml的每个子域部分都会更改默认模块名称.因此,对于部分默认为其前端,对于部分客户端为其客户端,等等.
现在
当我访问domain.com/client或domain.com/api-很好. API和客户端使用Client_Model_NameOfTheModel并按预期使用它-位于应用程序/模块/客户端/模型/NameOfTheModel.PHP和DbTable / NameOfTheModel.PHP
作品
但
当我从其各自的子域(client.domain.com,api.domain.com等)访问模块,并且默认模块已从前端更改为其各自的子域模块名称时,它将结束工作.它甚至不输出该“堆栈跟踪”.
Warning: 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 on line 136
Warning: include() [function.include]: Failed opening ‘Client/Model/ContactLists.PHP’ for inclusion (include_path='[heres-my-path-to-root]/library:.:/usr/lib/PHP:/usr/local/lib/PHP’) in [heres-my-path-to-root]/library/Zend/Loader.PHP on line 136
Fatal error: Class ‘Client_Model_ContactLists’ not found in [heres-my-path-to-root]/application/modules/client/controllers/ContactListsController.PHP on line 4
我已经尝试了2天才能使其正常运行.只是没有.它仅在默认域下工作,而在application.xml将其默认模块更改为其子域名时无效.像那样.目前,这一点非常关键,因为我无法继续操作,并且该应用需要在本周末退出沙盒(处于早期Beta测试).
感谢任何人的建议.
PS.对不起,英语不好.这不是我的母语
解决方法:
这只是一个粗略的猜测,但是由于以下几行,它似乎可能在默认情况下起作用:
$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) . "_",
就像您的其他命名空间一样.