我的项目中有这个问题,我不知道我还能做些什么来解决它。
在我的本地主机环境中,它的工作很好,但是当我将其发送到服务器时,只需停止工作并出现此警告+致命错误即可。
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
登录控制器.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(默认/模型/登录.php(:无法打开 流:中没有这样的文件或目录 /var/www/ecommerce/include_path/Zend/Loader.php 在第 134 行警告: include_once((: 打开"默认/模型/登录.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'( 在/var/www/ecommerce/include_path/Zend/Loader.php 第 134 行 致命 错误:在 中找不到类"Default_Models_Login" /var/www/wdna.com.br/admin2/application/modules/default/controllers/LoginController.php 在第 15 行
任何帮助将不胜感激。
我以前遇到过这个问题,结果证明这是一个错字。在Windows和OSX上,它并不真正关心您的文件名是否大小写正确(在大多数情况下(,但在Linux环境中它要严格得多。
即使您认为您的文件名遵循正确的大小写,请确保您的类名也遵循正确的大小写,这就是我发现我的错别字隐藏的地方。
你的类应该看起来像这样:
class Default_Model_Login {
}
虽然这可能会给你带来冲突,因为"默认"是Zend的默认模型,而不是显示为模型,而是显示为主要应用程序,这就是为什么许多类都以Default_开头的原因
希望这有帮助。
自动加载器区分大小写(在 Linux 上(,因此无论在哪里使用它,都需要对类名使用相同的大小写。在控制器中,您应该具有:
$login = new Default_Models_Login();
并且您的类应定义为:
class Default_Models_Login
(请注意两种情况下的大写字母"D"和"M"(。
您的库文件夹也位于包含路径上两次(列出的前两个路径是等效的(,因此您可能也想修复它。
编辑:抱歉,我给了你一些不好的信息。标准自动加载器(您正在使用的(希望能够仅根据类名在文件系统上查找类。由于它在 Linux 上区分大小写,因此要解决您的问题,您还需要将default
文件夹更改为 Default
,models
更改为 Models
。但这很可能会破坏其他事情。因此,标准自动加载器不是为自动加载 application
文件夹中的类而设计的。
假设您想坚持 ZF 约定,最好的解决方案是使用 ZF 的模块自动加载器(专为 application/modules
中的类设计(。为此,您需要:
为模块创建引导程序文件。此文件应位于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 倍。
解决方案是创建一个新的自动加载器
例:
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;
}
}
在引导.php中结束调用:
protected function _initAutoloading()
{
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->pushAutoloader(new MyLib_Autoloader());
}
"else"是调用不在模块中的类,数组是我创建的模块。