Zend 自动加载程序问题


Zend Auto loader problems

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

在我的本地主机环境中,它的工作很好,但是当我将其发送到服务器时,只需停止工作并出现此警告+致命错误即可。

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文件夹更改为 Defaultmodels更改为 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"是调用不在模块中的类,数组是我创建的模块。