3

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

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

我的项目

|_application
|_docs
|_public
|_library
           |_Zend
           |_Buyers
                     |_Donations.php
|_scripts

我将我的捐赠类命名为“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__)
));

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

4

2 回答 2

5

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

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

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

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

于 2011-06-23T11:31:39.853 回答
1

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

 require_once 'Buyer/Donations.php';

如果您确实希望将 zend 加载器与您自己的库代码一起使用,该库代码使用您自己的命名空间,您可以使用 registerNamespace() 方法将其注册到自动加载器。在引导程序中,您可以执行以下操作:

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(),
)));
于 2011-06-23T11:38:42.690 回答