Zend框架中的模块自动加载器

时间:2011-06-23 10:56:34

标签: php zend-framework module classloader zend-autoloader

我使用Zend框架开发项目,我遇到了以下问题。我正在使用使用zf.sh脚本生成的Zend框架MVC文件夹结构。

我的库文件夹有Zend库文件夹,它的类可以在应用程序内正常调用。我在我的库中为我的类创建了另一个文件夹。这是现在的文件夹结构:

MyProject的

| _Application
| _docs
| _Public
| _LIBRARY
     | _Zend
     | _Buyers
     | _Donations.php
| _scripts

我将我的Donation类命名为“Buyers_Donations”作为Zend框架命名约定。

当我在控制器中尝试使用此类时

$obj= new Buyers_Donation(); 

它给出了一个错误,在控制器内找不到类Buyers_Donation。

但是当我在我的Bootstrap中添加以下行时,它起作用了:

$loader = Zend_Loader_Autoloader::getInstance();
$loader->setFallbackAutoloader(true);
$moduleLoder = new Zend_Application_Module_Autoloader(
array(
'namespace'=>'',
'basePath'=>dirname(__FILE__)
));

有人可以解释实际发生的事情以及模块自动加载器的用途,尽管我的应用程序中没有任何模块吗?

2 个答案:

答案 0 :(得分:5)

如您所料,由于您没有使用模块,因此不应使用模块自动加载器。假设Zend *类正确地为您自动加载,您需要做的就是告诉标准自动加载器它还应该用于“买方”命名空间中的类。因此,请执行以下操作,而不是您发布的代码段:

$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Buyers_');

如果您愿意,也可以在application.ini中进行设置。

我还假设您的类在库文件夹中,而不是在您的问题所暗示的公共目录中(这会很糟糕)。

答案 1 :(得分:1)

如果您不想使用zend的自动加载功能,则必须使用require_once()手动包含文件,例如:

 require_once 'Buyer/Donations.php';

如果您确实希望将Zend加载器与您自己的库代码一起使用您自己的命名空间,则可以使用registerNamespace()方法将其注册到自动加载器。在bootstrap中,你可以这样做:

protected function _initAutoload()
{

    $autoloader = Zend_Loader_Autoloader::getInstance()->
                           registerNamespace('Buyers_')
    return $autoloader;
}

如果自动加载程序不起作用,请确保在某处设置库文件夹的包含路径。它由zend框架自动添加到public / index.php:

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
get_include_path(),
)));