Php Zend自动装载机问题
我的项目中有这个问题,我不知道我还能做些什么来解决它 在我的本地主机环境中,它可以正常工作,但当我将它发送到服务器时,只需使用此警告+致命错误停止工作即可Php Zend自动装载机问题,php,apache,.htaccess,zend-framework,bootstrapping,Php,Apache,.htaccess,Zend Framework,Bootstrapping,我的项目中有这个问题,我不知道我还能做些什么来解决它 在我的本地主机环境中,它可以正常工作,但当我将它发送到服务器时,只需使用此警告+致命错误停止工作即可 Warning: include_once(model/Login.php): failed to open stream: No such file or directory in /var/www/ecommerce/include_path/Zend/Loader.php on line 134 Warning: include_on
Warning: include_once(model/Login.php): failed to open stream:
No such file or directory in /var/www/ecommerce/include_path/Zend/Loader.php on line 134 Warning: include_once():
Failed opening 'model/Login.php' for inclusion
(include_path='/var/www/wdna.com.br/admin2/application/../library::/var/www/wdna.com.br/admin2/library:
/var/www/wdna.com.br/admin2/application/modules.:/usr/share/php:/var/www/ecommerce/include_path') in /var/www/ecommerce/include_path/Zend/Loader.php on line 134
Fatal error: Class 'model_Login' not found in /var/www/wdna.com.br/admin2/application/modules/default/controllers/LoginController.php on line 15
我的文件夹结构如下所示:
+---application
| \---modules
| \---default
| +---models
LoginController.php:
15 $login = new default_models_Login();
16 $login = $login->login($this->_getParam('login'), $this->_getParam('senha'));
我的函数_initAutoloader:
protected function _initAutoloader(){
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->registerNamespace('App');
}
新错误:
警告:include_once(Default/Models/Login.php):无法打开
流:中没有这样的文件或目录
/var/www/ecommerce/include_path/Zend/Loader.php第134行警告:
include_once():无法打开的“Default/Models/Login.php”
包含
(include_path='/var/www/wdna.com.br/admin2/application/。/library::/var/www/wdna.com.br/admin2/library:/var/www/wdna.com.br/admin2/application/modules.:/usr/share/php:/var/www/ecommerce/include_path')
在第134行的/var/www/ecommerce/include_path/Zend/Loader.php中
错误:在中找不到类“Default\u Models\u Login”
/var/www/wdna.com.br/admin2/application/modules/default/controllers/LoginController.php
第15行
任何帮助都将不胜感激。我以前遇到过这个问题,结果发现是打字错误。在Windows和OSX上,文件名的大小写是否正确并不重要(大多数情况下),但在Linux环境中,文件名的大小写要严格得多 即使您认为您的文件名大小写正确,也要确保您的类名也正确,这就是我发现拼写错误隐藏的地方 您的类应该如下所示:
class Default_Model_Login {
}
虽然这可能会给您带来冲突,因为“Default”是Zend的默认模型,而不是作为模型显示,而是作为主应用程序显示,这就是为什么很多类都以Default开头的原因_
希望这能有所帮助。自动加载程序区分大小写(在Linux上),因此无论在何处使用类名,都需要使用相同的大小写。在控制器中,您应该具有:
$login = new Default_Models_Login();
您的类应定义为:
class Default_Models_Login
(注意两种情况下的大写字母“D”和“M”)
您的库文件夹在include路径上也有两次(列出的前两个路径是等效的),因此您可能也想修复这一问题
编辑:抱歉,我给了你一些不好的信息。标准自动加载程序(您正在使用的)希望能够仅基于类名称在文件系统上查找类。由于它在Linux上区分大小写,要解决问题,您还需要将default
文件夹更改为default
,将models
更改为models
。但这可能会破坏其他东西。因此,标准自动加载器不是为自动加载应用程序
文件夹中的类而设计的
假设您希望遵守ZF约定,最好的解决方案是使用ZF的module autoloader(它专门为应用程序/模块中的类设计)。为此,您需要:
为您的模块创建引导文件。此文件应位于application/modules/default/Bootstrap.php
并包含:
class Default_Bootstrap extends Zend_Application_Module_Bootstrap
{
}
您可能还需要通过添加以下内容来初始化模块资源:
resources.modules[] =
到您的应用程序.ini
文件
这将为默认模块设置模块自动加载程序。默认情况下,模块自动加载程序设置了许多不同的资源(请参阅文档:),包括一个用于型号的资源。但是,默认设置假定您的类名将使用单词Model
,而不是Models
。因此,您还需要将类名更改为Default\u Model\u Login
(但将文件夹名保留为models
)。希望到时候一切都会好起来
所有这些在ZF2中都要容易100倍。解决方案是创建一个新的自动加载器
例如:
class MyLib_Autoloader implements Zend_Loader_Autoloader_Interface
{
public function autoload($class)
{
$include = str_replace('_', DIRECTORY_SEPARATOR, $class);
$folder = explode(DIRECTORY_SEPARATOR, $include);
if(in_array($folder[0], array('default', 'cep', 'boleto')))
require_once '..\..\application\modules\\' . $include . '.php';
else
require_once $include . '.php';
return $class;
}
}
Bootstrap.php中的结束调用:
protected function _initAutoloading()
{
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->pushAutoloader(new MyLib_Autoloader());
}
“else”用于调用不在模块中的类,数组是我创建的模块。Login.php文件的完整路径是什么?您是否仔细检查了服务器上的include_路径是否与本地环境中的路径相对应?看起来服务器找不到所需的文件“Login.php”嘿,谢谢你的评论,但我的模型都没有加载到服务器上我已经用这个模型的路径编辑了我的问题。那么这个文件的完整路径是什么呢/var/www/wdna.com.br/admin2/application/modules/default/models/Login.php
?您还可以添加LoginController.php的第15行,也许还可以添加一些关于您当前自动加载器设置的信息。我已经编辑了我的问题,如果您需要更多信息,请与我联系。谢谢Lionel,但不适合我。。。我已经检查过它是否有区分大小写的问题。不管怎样,谢谢。您是否尝试创建了一个不称为Default的类。我从来没有创建过一个模块并使用过默认值。我不能从其他模块调用模型,无论您的生产服务器的规格是什么?你的设置正确吗?它能找到Zend库吗?奇怪的是,我的本地主机上的一切都很好…我不知道服务器的规范=/我尝试了这个,但没有成功,我如何编辑我的包含路径?错误是否完全相同?我不相信如果你已经解决了这个问题,你会得到一个小写类名的错误。请张贴实际错误,如果它是不同的。嘿,老兄,Capiroto是在我的项目,这是不可能的,我做了你推荐的,但没有用…谢谢蒂姆,我创建了一个新的自动加载器并解决了问题,但我仍然非常感谢你的帮助!该类创建了哪个文件夹?