我在我的项目中遇到了这个问题,我不知道我还能做些什么来解决它。
在我的本地环境中,它的工作正常,但是当我将它发送到服务器时,只需停止使用这个警告+致命错误的文件。
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(默认/ Models / Login.php):无法打开 stream:没有这样的文件或目录 第134行/var/www/ecommerce/include_path/Zend/Loader.php警告: include_once():打开'Default / Models / Login.php'失败 包容 (include_path中='/无功/网络/ wdna.com.br /的admin2 /应用/../库:: /无功/网络/ wdna.com.br /的admin2 /库:/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_Models_Login' /var/www/wdna.com.br/admin2/application/modules/default/controllers/LoginController.php 在第15行
非常感谢任何帮助。
答案 0 :(得分:0)
之前我遇到过这个问题,结果却是一个错字。在Windows和OSX上,它并不关心你的文件名是否在正确的情况下(大多数情况下),但在Linux环境中它更严格。
即使您认为您的文件名遵循正确的案例,请确保您的班级名称也是如此,这就是我发现我的拼写错误隐藏的地方。
你的课应该是这样的:
class Default_Model_Login {
}
虽然这可能会给你一个冲突,因为'Default'是Zend的默认模型,并没有显示为模型,而是作为主应用程序,这就是为什么很多类都以Default _
开头的原因希望这有帮助。
答案 1 :(得分:0)
自动加载器区分大小写(在Linux上),因此无论您在何处使用它,都需要对类名使用相同的大小写。在您的控制器中,您应该:
$login = new Default_Models_Login();
并且您的班级应该定义为:
class Default_Models_Login
(注意两种情况下的首都'D'和'M'。)
您还在include路径上有两个库文件夹(列出的前两个路径是等效的),所以您可能也想修复它。
编辑:道歉,我给了你一些不好的信息。标准自动加载器(您正在使用的)希望能够仅根据类名在文件系统上查找类。由于它在Linux上区分大小写,为了解决您的问题,您还需要将default
文件夹更改为Default
,将models
更改为Models
。但这很可能打破其他事情。由于这个原因,标准自动加载器不适用于application
文件夹中的自动加载类。
最佳解决方案,假设您希望坚持使用ZF约定,那就是使用ZF的模块自动加载器(专为application/modules
内的类设计)。为此,您需要:
为您的模块创建一个bootstrap文件。此文件应位于application/modules/default/Bootstrap.php
并包含:
class Default_Bootstrap extends Zend_Application_Module_Bootstrap
{
}
您可能还需要通过添加:
来初始化模块资源resources.modules[] =
到您的application.ini
文件。
这应该为您的默认模块设置模块自动加载器。默认情况下,模块自动加载器会设置许多不同的资源(请参阅文档:http://framework.zend.com/manual/1.12/en/zend.loader.autoloader-resource.html#zend.loader.autoloader-resource.module),其中包括一个模型。但是,默认情况下,您的班级名称将使用单词Model
而不是Models
。因此,您还需要将您的班级名称更改为Default_Model_Login
(但将文件夹名称保留为models
)。希望它一切顺利!
所有这些在ZF2中大约容易100倍。
答案 2 :(得分:0)
解决方案是创建一个新的自动加载器
示例:
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”是调用不在模块中的类,数组是我创建的模块。