Zend Auto loader问题

时间:2013-10-08 18:34:56

标签: 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_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行

非常感谢任何帮助。

3 个答案:

答案 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”是调用不在模块中的类,数组是我创建的模块。