我使用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__)
));
有人可以解释实际发生的事情以及模块自动加载器的用途,尽管我的应用程序中没有任何模块吗?
答案 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(),
)));