1

我的项目中有这个问题,我不知道我还能做些什么来解决它。

在我的本地主机环境中,它工作得很好,但是当我将它发送到服务器时,只需停止使用这个警告+致命错误消息即可。

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(默认/Models/Login.php):无法打开流:第 134 行 /var/www/ecommerce/include_path/Zend/Loader.php 中没有此类文件或目录警告: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') 在 /var/www/ecommerce/include_path/Zend/Loader.php在第 134 行致命错误:在第 15 行的 /var/www/wdna.com.br/admin2/application/modules/default/controllers/LoginController.php 中找不到类“Default_Models_Login”

任何帮助都感激不尽。

4

3 回答 3

0

自动加载器区分大小写(在 Linux 上),因此无论您在何处使用类名,都需要使用相同的大小写。在您的控制器中,您应该具有:

$login = new Default_Models_Login();

你的班级应该被定义为:

class Default_Models_Login

(注意两种情况下的大写“D”和“M”)。

您的库文件夹在包含路径上也有两次(列出的前两个路径是等效的),因此您可能也想修复它。

编辑:抱歉,我给了你一些不好的信息。标准自动加载器(您正在使用的)期望能够仅根据类名在文件系统上找到类。由于它在 Linux 上区分大小写,因此要解决您的问题,您还需要将default文件夹更改为,Default和. 但这很可能会破坏其他东西。出于这个原因,标准自动加载器不是为自动加载文件夹中的类而设计的。modelsModelsapplication

最好的解决方案,假设你想坚持 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 倍。

于 2013-10-09T13:39:02.803 回答
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());
}

“其他”是调用不在模块中的类,数组是我创建的模块。

于 2013-10-11T14:52:09.763 回答
0

我以前遇到过这个问题,结果是一个错字。在 Windows 和 OSX 上,它并不关心您的文件名是否正确(大多数情况下),但在 Linux 环境中它更加严格。

即使你认为你的文件名遵循正确的大小写,也要确保你的类名也是如此,这是我发现我的错字隐藏的地方。

你的课应该是这样的:

class Default_Model_Login {
}

虽然这可能会给您带来冲突,因为“默认”是 Zend 的默认模型,而不是作为模型显示,而是作为主要应用程序显示,这就是为什么很多类都以 Default_ 开头的原因

希望这可以帮助。

于 2013-10-08T20:07:18.957 回答